コード例 #1
0
struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu)
{
	struct ring_buffer_event *e;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)	
	e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL, NULL);
#else
	e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL);
#endif
	if (e)
		goto event;
	if (ring_buffer_swap_cpu(op_ring_buffer_read,
				 op_ring_buffer_write,
				 cpu))
		return NULL;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)	
	e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL, NULL);
#else
	e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL);
#endif
	if (e)
		goto event;
	return NULL;

event:
	entry->event = e;
	entry->sample = ring_buffer_event_data(e);
	entry->size = (ring_buffer_event_length(e) - sizeof(struct op_sample))
		/ sizeof(entry->sample->data[0]);
	entry->data = entry->sample->data;
	return entry->sample;
}
コード例 #2
0
ファイル: ring_buffer.c プロジェクト: Open-Party/systemtap
static void _stp_ring_buffer_consume(struct _stp_iterator *iter)
{
	_stp_ring_buffer_iterator_increment(iter);
	_stp_ring_buffer_disable_cpu();
#ifdef STAPCONF_RING_BUFFER_LOST_EVENTS
	ring_buffer_consume(_stp_relay_data.rb, iter->cpu, &iter->ts, NULL);
#else
	ring_buffer_consume(_stp_relay_data.rb, iter->cpu, &iter->ts);
#endif
	_stp_ring_buffer_enable_cpu();
	atomic_dec(&iter->nr_events);
}
コード例 #3
0
ファイル: trace_selftest.c プロジェクト: AlexShiLucky/linux
static int trace_test_buffer_cpu(struct trace_buffer *buf, int cpu)
{
	struct ring_buffer_event *event;
	struct trace_entry *entry;
	unsigned int loops = 0;

	while ((event = ring_buffer_consume(buf->buffer, cpu, NULL, NULL))) {
		entry = ring_buffer_event_data(event);

		/*
		 * The ring buffer is a size of trace_buf_size, if
		 * we loop more than the size, there's something wrong
		 * with the ring buffer.
		 */
		if (loops++ > trace_buf_size) {
			printk(KERN_CONT ".. bad ring buffer ");
			goto failed;
		}
		if (!trace_valid_entry(entry)) {
			printk(KERN_CONT ".. invalid entry %d ",
				entry->type);
			goto failed;
		}
	}
	return 0;

 failed:
	/* disable tracing */
	tracing_disabled = 1;
	printk(KERN_CONT ".. corrupted trace buffer .. ");
	return -1;
}
コード例 #4
0
static int trace_test_buffer_cpu(struct trace_array *tr, int cpu)
{
	struct ring_buffer_event *event;
	struct trace_entry *entry;
	unsigned int loops = 0;

	while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) {
		entry = ring_buffer_event_data(event);

		
		if (loops++ > trace_buf_size) {
			printk(KERN_CONT ".. bad ring buffer ");
			goto failed;
		}
		if (!trace_valid_entry(entry)) {
			printk(KERN_CONT ".. invalid entry %d ",
				entry->type);
			goto failed;
		}
	}
	return 0;

 failed:
	
	tracing_disabled = 1;
	printk(KERN_CONT ".. corrupted trace buffer .. ");
	return -1;
}
コード例 #5
0
/**
 * buffer_get_sample - remove a hardware latency sample from the ring buffer
 * @sample: Pre-allocated storage for the sample
 *
 * This retrieves a hardware latency sample from the global circular buffer
 */
static struct sample *buffer_get_sample(struct sample *sample)
{
	struct ring_buffer_event *e = NULL;
	struct sample *s = NULL;
	unsigned int cpu = 0;

	if (!sample)
		return NULL;

	mutex_lock(&ring_buffer_mutex);
	for_each_online_cpu(cpu) {
		e = ring_buffer_consume(ring_buffer, cpu, NULL);
		if (e)
			break;
	}

	if (e) {
		s = ring_buffer_event_data(e);
		memcpy(sample, s, sizeof(struct sample));
	} else
		sample = NULL;
	mutex_unlock(&ring_buffer_mutex);

	return sample;
}
コード例 #6
0
ファイル: platform_uart.c プロジェクト: yangk/Mico
OSStatus platform_uart_receive_bytes( platform_uart_driver_t* driver, uint8_t* data_in, uint32_t expected_data_size, uint32_t timeout_ms )
{
  OSStatus err = kNoErr;

  //platform_mcu_powersave_disable();

  require_action_quiet( ( driver != NULL ) && ( data_in != NULL ) && ( expected_data_size != 0 ), exit, err = kParamErr);

  mico_rtos_get_semaphore( &driver->rx_complete, 0 );

  if ( driver->rx_buffer != NULL)
  {
    while ( expected_data_size != 0 )
    {
      uint32_t transfer_size = MIN( driver->rx_buffer->size / 2, expected_data_size );

        /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
        driver->last_receive_result = kNoErr;
        driver->rx_size             = transfer_size;
      
      /* Check if ring buffer already contains the required amount of data. */
      if ( transfer_size > ring_buffer_used_space( driver->rx_buffer ) )
      {
        err = mico_rtos_get_semaphore( &driver->rx_complete, timeout_ms );

        /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
        driver->rx_size = 0;

        if( err != kNoErr )
          goto exit;
      }else {
        driver->rx_size = 0;
      }
      err = driver->last_receive_result;
      expected_data_size -= transfer_size;
      
      // Grab data from the buffer
      do
      {
        uint8_t* available_data;
        uint32_t bytes_available;
        
        ring_buffer_get_data( driver->rx_buffer, &available_data, &bytes_available );
        bytes_available = MIN( bytes_available, transfer_size );
        memcpy( data_in, available_data, bytes_available );
        transfer_size -= bytes_available;
        data_in = ( (uint8_t*) data_in + bytes_available );
        ring_buffer_consume( driver->rx_buffer, bytes_available );
      } while ( transfer_size != 0 );
    }
  }
  else
  {
    err = receive_bytes( driver, data_in, expected_data_size, timeout_ms );
  }
exit:
  //platform_mcu_powersave_enable();
  return err;
}
コード例 #7
0
ファイル: cpu_buffer.c プロジェクト: 12rafael/jellytimekernel
struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu)
{
	struct ring_buffer_event *e;
	e = ring_buffer_consume(op_ring_buffer, cpu, NULL, NULL);
	if (!e)
		return NULL;

	entry->event = e;
	entry->sample = ring_buffer_event_data(e);
	entry->size = (ring_buffer_event_length(e) - sizeof(struct op_sample))
		/ sizeof(entry->sample->data[0]);
	entry->data = entry->sample->data;
	return entry->sample;
}
コード例 #8
0
ファイル: uart.c プロジェクト: agb861/STM32F
int UART_Recv(u8 *recvBuf, u32 bufLen, u32 timeOut)
{
  while (bufLen != 0){
    uint32_t transfer_size = MIN(rx_buffer.size / 2, bufLen);
    
    /* Check if ring buffer already contains the required amount of data. */
    if ( transfer_size > ring_buffer_used_space( &rx_buffer ) ) {
      /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
      rx_size = transfer_size;
      if ( mico_rtos_get_semaphore( &rx_complete, timeOut ) != 0 ){
        rx_size = 0;
        return -1;
      }
      /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
      rx_size = 0;
    }
    
    bufLen -= transfer_size;
    
    // Grab data from the buffer
    do
    {
      uint8_t* available_data;
      uint32_t bytes_available;
      
      ring_buffer_get_data( &rx_buffer, &available_data, &bytes_available );
      bytes_available = MIN( bytes_available, transfer_size );
      memcpy( recvBuf, available_data, bytes_available );
      transfer_size -= bytes_available;
      recvBuf = ( (uint8_t*) recvBuf + bytes_available );
      ring_buffer_consume( &rx_buffer, bytes_available );
    } while ( transfer_size != 0 );
  }
  
  if ( bufLen != 0 ) {
    return -1;
  }
  else{
    return 0;
  }
}
コード例 #9
0
ファイル: ring_buffer.c プロジェクト: 119/bcm-wiced-sdk
wiced_result_t ring_buffer_read( wiced_ring_buffer_t* ring_buffer, uint8_t* data, uint32_t data_length, uint32_t* number_of_bytes_read )
{
    uint32_t max_bytes_to_read;
    uint32_t i;
    uint32_t head = ring_buffer->head;

    wiced_assert("Bad args", ring_buffer != NULL && data != NULL && number_of_bytes_read != NULL);

    max_bytes_to_read = MIN(data_length, ring_buffer_used_space(ring_buffer));

    if ( max_bytes_to_read != 0 )
    {
        for ( i = 0; i != max_bytes_to_read; i++, ( head = ( head + 1 ) % ring_buffer->size ) )
        {
            data[ i ] = ring_buffer->buffer[ head ];
        }

        ring_buffer_consume( ring_buffer, max_bytes_to_read );
    }

    *number_of_bytes_read = max_bytes_to_read;
    return WICED_SUCCESS;
}
コード例 #10
0
ファイル: ringbuf.c プロジェクト: cyysu/AliOS-Things
int ring_buffer_read( ring_buffer_t* ring_buffer, uint8_t* data, uint32_t data_length, uint32_t* number_of_bytes_read )
{
  uint32_t max_bytes_to_read;
  uint32_t i;
  uint32_t head;
  
  head = ring_buffer->head;
  
  max_bytes_to_read = MIN(data_length, ring_buffer_used_space(ring_buffer));
  
  if ( max_bytes_to_read != 0 )
  {
    for ( i = 0; i != max_bytes_to_read; i++, ( head = ( head + 1 ) % ring_buffer->size ) )
    {
      data[ i ] = ring_buffer->buffer[ head ];
    }
    
    ring_buffer_consume( ring_buffer, max_bytes_to_read );
  }
  
  *number_of_bytes_read = max_bytes_to_read;
  
  return 0;
}
コード例 #11
0
ファイル: MicoDriverUart.c プロジェクト: 70year/MICO
OSStatus MicoUartRecv( mico_uart_t uart, void* data, uint32_t size, uint32_t timeout )
{
#if RING_BUFF_ON
  if (uart_interfaces[uart].rx_buffer != NULL)
  {
    while (size != 0)
    {
      uint32_t transfer_size = MIN(uart_interfaces[uart].rx_buffer->size / 2, size);
      
      /* Check if ring buffer already contains the required amount of data. */
      if ( transfer_size > ring_buffer_used_space( uart_interfaces[uart].rx_buffer ) )
      {
        /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
        uart_interfaces[uart].rx_size = transfer_size;
#ifndef NO_MICO_RTOS
        if ( mico_rtos_get_semaphore( &uart_interfaces[uart].rx_complete, timeout) != kNoErr )
        {
          uart_interfaces[uart].rx_size = 0;
          return kTimeoutErr;
        }
#else
        uart_interfaces[uart].rx_complete = false;
        int delay_start = mico_get_time_no_os();
        while(uart_interfaces[uart].rx_complete == false){
          if(mico_get_time_no_os() >= delay_start + timeout && timeout != MICO_NEVER_TIMEOUT){
            uart_interfaces[uart].rx_size = 0;
            return kTimeoutErr;
          }
        }
#endif
        /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
        uart_interfaces[uart].rx_size = 0;
      }
     
      size -= transfer_size;
      
      // Grab data from the buffer
      do
      {
        uint8_t* available_data;
        uint32_t bytes_available;
         //platform_log("uart receive 03"); 
        ring_buffer_get_data( uart_interfaces[uart].rx_buffer, &available_data, &bytes_available );
        bytes_available = MIN( bytes_available, transfer_size );
        memcpy( data, available_data, bytes_available );
        transfer_size -= bytes_available;
        data = ( (uint8_t*) data + bytes_available );
        ring_buffer_consume( uart_interfaces[uart].rx_buffer, bytes_available );
      } while ( transfer_size != 0 );
    }
    
    if ( size != 0 )
    {
      return kGeneralErr;
    }
    else
    {
      return kNoErr;
    }
  }
  else
  {
    return platform_uart_receive_bytes( uart, data, size, timeout );
  }
#else
    return platform_uart_receive_bytes( uart, data, size, timeout );
#endif 
 // return kNoErr;
}
コード例 #12
0
platform_result_t platform_uart_receive_bytes( platform_uart_driver_t* driver, uint8_t* data_in, uint32_t expected_data_size, uint32_t timeout_ms )
{
    /*The following is a temporary implemenration of the UART*/
    platform_result_t result = PLATFORM_SUCCESS;
    wiced_assert( "bad argument", ( driver != NULL ) && ( data_in != NULL ) && ( expected_data_size != 0 ) );

    if ( driver->rx_buffer != NULL )
    {
        while ( expected_data_size != 0 )
        {
            uint32_t transfer_size = MIN( driver->rx_buffer->size / 2, expected_data_size );

            /* Check if ring buffer already contains the required amount of data. */
            if ( transfer_size > ring_buffer_used_space( driver->rx_buffer ) )
            {
                wwd_result_t wwd_result;

                /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
                WICED_DISABLE_INTERRUPTS( );
                driver->last_receive_result = PLATFORM_SUCCESS;
                driver->rx_size = transfer_size;
                WICED_ENABLE_INTERRUPTS( );

                wwd_result = host_rtos_get_semaphore( &driver->rx_complete, timeout_ms, WICED_TRUE );

                /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
                WICED_DISABLE_INTERRUPTS( );
                driver->rx_size = 0;
                WICED_ENABLE_INTERRUPTS( );

                if ( wwd_result == WWD_TIMEOUT )
                {
                    /* Semaphore timeout. breaks from the while loop */
                    result = PLATFORM_TIMEOUT;
                    break;
                }
                else
                {
                    /* No timeout. retrieve result */
                    result = driver->last_receive_result;
                }
            }

            expected_data_size -= transfer_size;

            // Grab data from the buffer
            do
            {
                uint8_t* available_data;
                uint32_t bytes_available;

                ring_buffer_get_data( driver->rx_buffer, &available_data, &bytes_available );
                bytes_available = MIN( bytes_available, transfer_size );
                memcpy( data_in, available_data, bytes_available );
                transfer_size -= bytes_available;
                data_in = ( (uint8_t*) data_in + bytes_available );
                ring_buffer_consume( driver->rx_buffer, bytes_available );
            } while ( transfer_size != 0 );
        }

        return result;
    }
    else
    {
        return result;
    }
}
コード例 #13
0
ファイル: platform_uart.c プロジェクト: karlnet/mico
OSStatus platform_uart_receive_bytes( platform_uart_driver_t* driver, uint8_t* data_in, uint32_t expected_data_size, uint32_t timeout_ms )
{
    OSStatus err = kNoErr;
    uint32_t transfer_size;

    //platform_mcu_powersave_disable();

    require_action_quiet( ( driver != NULL ) && ( data_in != NULL ) && ( expected_data_size != 0 ), exit, err = kParamErr);
    require_action_quiet( driver->rx_ring_buffer != NULL , exit, err = kUnsupportedErr);

    while ( expected_data_size != 0 )
    {
        transfer_size = MIN(driver->rx_ring_buffer->size / 2, expected_data_size);

        /* Check if ring buffer already contains the required amount of data. */
        if ( transfer_size > ring_buffer_used_space( driver->rx_ring_buffer ) )
        {
            /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
            driver->rx_size = transfer_size;

#ifndef NO_MICO_RTOS
            if ( mico_rtos_get_semaphore( &driver->rx_complete, timeout_ms ) != kNoErr )
            {
                driver->rx_size = 0;
                err = kTimeoutErr;
                goto exit;
            }

            /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
            driver->rx_size = 0;
#else
            driver->rx_complete = false;
            int delay_start = mico_get_time_no_os();
            while(driver->rx_complete == false) {
                if(mico_get_time_no_os() >= delay_start + timeout_ms && timeout_ms != MICO_NEVER_TIMEOUT) {
                    driver->rx_size = 0;
                    err = kTimeoutErr;
                    goto exit;
                }
            }
            driver->rx_size = 0;
#endif
        }
        expected_data_size -= transfer_size;

        // Grab data from the buffer
        do
        {
            uint8_t* available_data;
            uint32_t bytes_available;

            ring_buffer_get_data( driver->rx_ring_buffer, &available_data, &bytes_available );
            bytes_available = MIN( bytes_available, transfer_size );
            memcpy( data_in, available_data, bytes_available );
            transfer_size -= bytes_available;
            data_in = ( (uint8_t*)data_in + bytes_available );
            ring_buffer_consume( driver->rx_ring_buffer, bytes_available );
        }
        while ( transfer_size != 0 );
    }

    require_action( expected_data_size == 0, exit, err = kReadErr);

exit:
    //platform_mcu_powersave_enable();
    return err;
}
コード例 #14
0
platform_result_t platform_uart_receive_bytes( platform_uart_driver_t* driver, uint8_t* data_in, uint32_t expected_data_size, uint32_t timeout_ms )
{
    UNUSED_PARAMETER(driver);
    UNUSED_PARAMETER(data_in);
    UNUSED_PARAMETER(expected_data_size);
    UNUSED_PARAMETER(timeout_ms);

    if ( driver->rx_ring_buffer != NULL )
    {
        while ( expected_data_size != 0 )
        {
            uint32_t transfer_size = MIN(driver->rx_ring_buffer->size / 2, expected_data_size);

            /* Check if ring buffer already contains the required amount of data. */
            if ( transfer_size > ring_buffer_used_space( driver->rx_ring_buffer ) )
            {
                /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
                driver->rx_transfer_size = transfer_size;

                if ( host_rtos_get_semaphore( &driver->rx_dma_complete, timeout_ms, WICED_FALSE ) != WWD_SUCCESS )
                {
                    driver->rx_transfer_size = 0;
                    return PLATFORM_TIMEOUT;
                }

                /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
                driver->rx_transfer_size = 0;
            }

            expected_data_size -= transfer_size;

            // Grab data from the buffer
            do
            {
                uint8_t* available_data;
                uint32_t bytes_available;

                ring_buffer_get_data( driver->rx_ring_buffer, &available_data, &bytes_available );
                bytes_available = MIN( bytes_available, transfer_size );
                memcpy( data_in, available_data, bytes_available );
                transfer_size -= bytes_available;
                data_in = ( (uint8_t*)data_in + bytes_available );
                ring_buffer_consume( driver->rx_ring_buffer, bytes_available );
            }
            while ( transfer_size != 0 );
        }

        if ( expected_data_size != 0 )
        {
            return PLATFORM_ERROR;
        }
        else
        {
            return PLATFORM_SUCCESS;
        }
    }
    else
    {
        /* TODO: need to implement this */
        return PLATFORM_UNSUPPORTED;
    }
}
コード例 #15
0
ファイル: platform_uart.c プロジェクト: hujg/mico_v2.2.0
static OSStatus FUartRecv( platform_uart_driver_t* driver, void* data, uint32_t size, uint32_t timeout )
{

  if ( driver->rx_buffer != NULL )
  {
    while (size != 0)
    {
      uint32_t transfer_size = MIN( driver->rx_buffer->size/2, size );
      
      /* Check if ring buffer already contains the required amount of data. */
      if ( transfer_size > ring_buffer_used_space( driver->rx_buffer ) )
      {
        /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */
        driver->rx_size = transfer_size;
        
#ifndef NO_MICO_RTOS
        if ( mico_rtos_get_semaphore( &driver->rx_complete, timeout) != kNoErr )
        {
          driver->rx_size = 0;
          return kTimeoutErr;
        }
#else
        driver->rx_complete = false;
        int delay_start = mico_get_time_no_os();
        while(driver->rx_complete == false){
          if(mico_get_time_no_os() >= delay_start + timeout && timeout != MICO_NEVER_TIMEOUT){
            driver->rx_size = 0;
            return kTimeoutErr;
          }
        }
#endif
        
        /* Reset rx_size to prevent semaphore being set while nothing waits for the data */
        driver->rx_size = 0;
      }
      
      size -= transfer_size;
      
      // Grab data from the buffer
      do
      {
        uint8_t* available_data;
        uint32_t bytes_available;
        
        ring_buffer_get_data( driver->rx_buffer, &available_data, &bytes_available );
        bytes_available = MIN( bytes_available, transfer_size );
        memcpy( data, available_data, bytes_available );
        transfer_size -= bytes_available;
        data = ( (uint8_t*) data + bytes_available );
        ring_buffer_consume( driver->rx_buffer, bytes_available );
      } while ( transfer_size != 0 );
    }
    
    if ( size != 0 )
    {
      return kGeneralErr;
    }
    else
    {
      return kNoErr;
    }
  }
  else
  {
    mico_thread_msleep(timeout);
    return kNoMemoryErr;
  }
}