本文整理汇总了C++中xSemaphoreTake函数的典型用法代码示例。如果您正苦于以下问题:C++ xSemaphoreTake函数的具体用法?C++ xSemaphoreTake怎么用?C++ xSemaphoreTake使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了xSemaphoreTake函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GUI_X_WaitEvent
void GUI_X_WaitEvent (void)
{
while( xSemaphoreTake(xSemaTxDone, portMAX_DELAY ) != pdTRUE );
}
示例2: vHTTPTask
/*-----------------------------------------------------------*/
void vHTTPTask( void * pvParameters )
{
short i, sLen;
unsigned char ucState;
( void ) pvParameters;
/* Create the semaphore used to communicate between this task and the
WIZnet ISR. */
vSemaphoreCreateBinary( xTCPSemaphore );
/* Make sure everything is setup before we start. */
prvNetifInit();
prvHTTPInit();
for( ;; )
{
/* Wait until the ISR tells us there is something to do. */
xSemaphoreTake( xTCPSemaphore, portMAX_DELAY );
/* Check each socket. */
for( i = 0; i < httpSOCKET_NUM; i++ )
{
ucState = select( i, SEL_CONTROL );
switch (ucState)
{
case SOCK_ESTABLISHED : /* new connection established. */
if( ( sLen = select( i, SEL_RECV ) ) > 0 )
{
if( sLen > httpSOCKET_BUFFER_SIZE )
{
sLen = httpSOCKET_BUFFER_SIZE;
}
disable();
sLen = recv( i, ucSocketBuffer, sLen );
if( ucConnection[ i ] == 1 )
{
/* This is our first time processing a HTTP
request on this connection. */
prvTransmitHTTP( i );
ucConnection[i] = 0;
}
enable();
}
break;
case SOCK_CLOSE_WAIT :
close(i);
break;
case SOCK_CLOSED :
ucConnection[i] = 1;
socket( i, SOCK_STREAM, 80, 0x00 );
NBlisten( i ); /* reinitialize socket. */
break;
}
}
}
}
示例3: prvCDCCommandConsoleTask
static void prvCDCCommandConsoleTask( void *pvParameters )
{
char cRxedChar;
uint8_t ucInputIndex = 0;
char *pcOutputString;
static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
portBASE_TYPE xReturned;
( void ) pvParameters;
/* Obtain the address of the output buffer. Note there is no mutual
exclusion on this buffer as it is assumed only one command console
interface will be used at any one time. */
pcOutputString = FreeRTOS_CLIGetOutputBuffer();
/* Initialise the virtual com port (CDC) interface. */
prvSetupUSBDrivers();
/* Send the welcome message. This probably won't be seen as the console
will not have been connected yet. */
USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcWelcomeMessage, strlen( pcWelcomeMessage ) );
for( ;; )
{
/* No characters received yet for the current input string. */
cRxedChar = 0;
/* Only interested in reading one character at a time. */
cRxedChar = cGetCDCChar();
if( xSemaphoreTake( xCDCMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
{
/* Echo the character back. */
USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) &cRxedChar, sizeof( uint8_t ) );
/* Was it the end of the line? */
if( cRxedChar == '\n' || cRxedChar == '\r' )
{
/* Just to space the output from the input. */
USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcNewLine, strlen( pcNewLine ) );
/* See if the command is empty, indicating that the last command is
to be executed again. */
if( ucInputIndex == 0 )
{
/* Copy the last command back into the input string. */
strcpy( cInputString, cLastInputString );
}
/* Pass the received command to the command interpreter. The
command interpreter is called repeatedly until it returns pdFALSE
(indicating there is no more output) as it might generate more than
one string. */
do
{
/* Get the next output string from the command interpreter. */
xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
/* Write the generated string to the CDC. */
USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcOutputString, strlen( pcOutputString ) );
vTaskDelay( 1 );
} while( xReturned != pdFALSE );
/* All the strings generated by the input command have been sent.
Clear the input string ready to receive the next command. Remember
the command that was just processed first in case it is to be
processed again. */
strcpy( cLastInputString, cInputString );
ucInputIndex = 0;
memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ) );
}
else
{
if( cRxedChar == '\r' )
{
/* Ignore the character. */
}
else if( cRxedChar == '\b' )
{
/* Backspace was pressed. Erase the last character in the
string - if any. */
if( ucInputIndex > 0 )
{
ucInputIndex--;
cInputString[ ucInputIndex ] = '\0';
}
}
else
{
/* A character was entered. Add it to the string
entered so far. When a \n is entered the complete
string will be passed to the command interpreter. */
if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
{
if( ucInputIndex < cmdMAX_INPUT_SIZE )
{
cInputString[ ucInputIndex ] = cRxedChar;
//.........这里部分代码省略.........
示例4: vuIP_Task
//.........这里部分代码省略.........
/* Create the semaphore used by the ISR to wake this task. */
vSemaphoreCreateBinary( xEMACSemaphore );
/* Initialise the uIP stack. */
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
uip_init();
uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
uip_sethostaddr( xIPAddr );
httpd_init();
/* Initialise the MAC. */
while( Init_EMAC() != pdPASS )
{
vTaskDelay( uipINIT_WAIT );
}
portENTER_CRITICAL();
{
IntEnable = INT_RX_DONE;
VICIntEnable |= 0x00200000;
VICVectAddr21 = ( portLONG ) vEMAC_ISR_Wrapper;
prvSetMACAddress();
}
portEXIT_CRITICAL();
for( ;; )
{
/* Is there received data ready to be processed? */
uip_len = uiGetEMACRxData( uip_buf );
if( uip_len > 0 )
{
/* Standard uIP loop taken from the uIP manual. */
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
{
uip_arp_ipin();
uip_input();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
uip_arp_out();
prvENET_Send();
}
}
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
{
uip_arp_arpin();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
prvENET_Send();
}
}
}
else
{
if( timer_expired( &periodic_timer ) )
{
timer_reset( &periodic_timer );
for( i = 0; i < UIP_CONNS; i++ )
{
uip_periodic( i );
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
uip_arp_out();
prvENET_Send();
}
}
/* Call the ARP timer function every 10 seconds. */
if( timer_expired( &arp_timer ) )
{
timer_reset( &arp_timer );
uip_arp_timer();
}
}
else
{
/* We did not receive a packet, and there was no periodic
processing to perform. Block for a fixed period. If a packet
is received during this period we will be woken by the ISR
giving us the Semaphore. */
xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );
}
}
}
}
示例5: vuIP_Task
//.........这里部分代码省略.........
/* Initialise the uIP stack. */
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
uip_init();
uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
uip_sethostaddr( xIPAddr );
uip_ipaddr( xIPAddr, uipNET_MASK0, uipNET_MASK1, uipNET_MASK2, uipNET_MASK3 );
uip_setnetmask( xIPAddr );
uip_ipaddr( xIPAddr, uipGATEWAY_ADDR0, uipGATEWAY_ADDR1, uipGATEWAY_ADDR2, uipGATEWAY_ADDR3 );
uip_setdraddr( xIPAddr );
httpd_init();
/* Initialise the MAC. */
ENET_InitClocksGPIO();
ENET_Init();
portENTER_CRITICAL();
{
ENET_Start();
prvSetMACAddress();
VIC_Config( ENET_ITLine, VIC_IRQ, 1 );
VIC_ITCmd( ENET_ITLine, ENABLE );
ENET_DMA->ISR = uipDMI_RX_CURRENT_DONE;
ENET_DMA->IER = uipDMI_RX_CURRENT_DONE;
}
portEXIT_CRITICAL();
while(1)
{
/* Is there received data ready to be processed? */
uip_len = ENET_HandleRxPkt( uip_buf );
if( uip_len > 0 )
{
/* Standard uIP loop taken from the uIP manual. */
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
{
uip_arp_ipin();
uip_input();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
uip_arp_out();
prvENET_Send();
}
}
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
{
uip_arp_arpin();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
prvENET_Send();
}
}
}
else
{
if( timer_expired( &periodic_timer ) )
{
timer_reset( &periodic_timer );
for( i = 0; i < UIP_CONNS; i++ )
{
uip_periodic( i );
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
uip_arp_out();
prvENET_Send();
}
}
/* Call the ARP timer function every 10 seconds. */
if( timer_expired( &arp_timer ) )
{
timer_reset( &arp_timer );
uip_arp_timer();
}
}
else
{
/* We did not receive a packet, and there was no periodic
processing to perform. Block for a fixed period. If a packet
is received during this period we will be woken by the ISR
giving us the Semaphore. */
xSemaphoreTake( xSemaphore, configTICK_RATE_HZ / 2 );
}
}
}
}
示例6: vGpsTask
void vGpsTask(void *pvParameters)
{
delay_ms(100);
GpsInitialization();
//UART_Send(LPC_UART0, "$PMTK314,0,0,0,5,0,0,0,0,1,1,1,1,1,1,1,1,1*2C\r\n", 47, BLOCKING );
//UART_Send(LPC_UART0,(uint8_t *) "$PMTK314,0,0,0,5,5,5,0,0,1,1,1,1,1,1,1,1,1*2C\r\n", 47, BLOCKING );
UART_Send(LPC_UART0,(uint8_t *) "$PMTK314,1,1,1,1,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0*2C\r\n",52, BLOCKING);
//UART_Send(LPC_UART0,(uint8_t *) "$PMTK000*32\r\n",13, BLOCKING);
UART_Send(LPC_UART0,(uint8_t *) "$PMTK101*32\r\n",13, BLOCKING);
while(UART_CheckBusy(LPC_UART0));
NVIC_EnableIRQ(UART0_IRQn);
while(1)
{
gpsSetProcessingBuffer(-1);
if(xSemaphoreTake(xSemaphoreGPS,portMAX_DELAY) == pdTRUE)
{
gpsSetProcessingBuffer(0);
gps_tokenize_input();
char *token_msgid = gps_getToken(0);
if( strcmp(token_msgid, "$GPGGA") == 0)
{
//$GPGGA,081604.000,5204.8543,N,02101.6233,E,1,8,1.06,96.7,M,39.3,M,,*66
//$GPGGA,082316.000,5204.8526,N,02101.6227,E,1,8,1.04,93.9,M,39.3,M,,*6C
//$GPGGA,083352.000,5205.1129,N,02102.3054,E,2,9,0.99,107.4,M,39.3,M,0000,0000*58
asm("nop");
// if(checkFixPresence()!=0)
// {
// parseGgaMessage();
// }
} else if (strcmp(token_msgid, "$GPRMC")==0) {
//$GPRMC,081253.000,A,5204.8527,N,02101.6226,E,0.04,0.00,210214,,,A*6A
//$GPRMC,082223.000,A,5204.8527,N,02101.6234,E,0.33,175.46,210214,,,A*68
char *test = gps_getToken(2);
if(test[0] == 'V') {
asm("nop");
} else if (test[0] == 'A') {
asm("nop");
}
} else if (strncmp(token_msgid, "GPGSA", 5)==0) {
// GSA - SATELITES AVAILVLE
//$GPGSA,A,3,20,31,17,11,01,,,,,,,,1.80,1.54,0.93*06
//$GPGSA,A,3,20,31D*0C\r\n
asm("nop");
} else if (strncmp(token_msgid, "GPVTG", 5) == 0) {
//$GPVTG,71.41,T,,M,0.06,N,0.10,K,A*09\r\n
// 10 km/h
//$GPVTG,70.02,T,,M,8.04,N,14.90,K,A*38\r\n
// 25 km/h
//$GPVTG,248.73,T,,M,12.53,N,23.23,K,D*37
asm("nop");
} else if (strncmp(token_msgid, "GPGSV", 5) == 0) {
// GSV - Satelistes in view
// $GPGSV,4,1,13,20,76,279,46,01,62,169,45,32,61,082,44,23,40,210,48*7F
// $GPGSV,2,1,08,20,71,276,26,01,67,172,40,11,37,173,31,31,32,091,*79
char *test = getFieldPtr(3);
if (strncmp(test, "00", 2)!= 0) {
asm("nop");
}
} else if (strncmp(token_msgid, "PMTK011",7)==0) {
asm("nop");
} else if (strncmp(token_msgid, "PMTK010", 7)==0) {
asm("nop");
} else {
asm("nop");
}
}
// vTaskDelay(1000/portTICK_RATE_MS);
}
}
示例7: print_table_information
void print_table_information(void)
{
neighbor_info_t *b;
#ifdef HAVE_ROUTING
uint8_t addres_length=0;
route_info_t *ptr;
#endif
if( xSemaphoreTake( table_lock, ( portTickType ) 10 ) == pdTRUE )
{
uint8_t i, j;
if(neighbor_table.count)
{
debug("Neighbor Info count:");
debug_hex(neighbor_table.count);
debug("\r\n");
debug("Child count:");
debug_hex(neighbor_table.child_count);
debug("\r\n");
for(i=0; i < MAX_NEIGHBOR_COUNT; i++)
{
b=&(neighbor_table.neighbor_info[i]);
if(b->type==ADDR_NONE)
b=0;
if(b)
{
if(b->type== ADDR_802_15_4_PAN_LONG)
{
debug("Long: ");
for(j=0; j < 2 ; j++)
{
if (j) debug_put(':');
debug_hex( b->address[9-j]);
}
debug(" ");
for(j=0; j < 8 ; j++)
{
if (j) debug_put(':');
debug_hex( b->address[7-j]);
}
}
if(b->type == ADDR_802_15_4_PAN_SHORT)
{
debug("Short: ");
for(j=0; j < 2 ; j++)
{
if (j) debug_put(':');
debug_hex( b->address[3-j]);
}
debug(" ");
for(j=0; j < 2 ; j++)
{
if (j) debug_put(':');
debug_hex( b->address[1-j]);
}
}
debug("\r\nrssi: ");
debug_int(b->last_rssi);
debug("\r\nTTL: ");
debug_hex(b->ttl);
debug("\r\n");
pause_us(200);
}
}
}
else
{
debug("No Neighbor info\r\n");
}
#ifdef HAVE_ROUTING
if(routing_table.count)
{
debug("\r\nroute Info count:");
debug_hex(routing_table.count);
debug("\r\n");
for(i=0; i < MAX_ROUTE_INFO_COUNT; i++)
{
ptr = &(routing_table.route_info[i]);
if(ptr->dest_addr_type==ADDR_NONE)
ptr=0;
if(ptr)
{
debug("Dest: ");
if(ptr->dest_addr_type==ADDR_802_15_4_PAN_LONG)
addres_length=8;
else
addres_length=2;
for(j=0; j < addres_length ; j++)
{
if (j) debug_put(':');
debug_hex(ptr->destination[(addres_length-1)-j]);
}
debug("\r\nNext hop: ");
if(ptr->next_hop_addr_type==ADDR_802_15_4_PAN_LONG)
addres_length=10;
else
//.........这里部分代码省略.........
示例8: wc_LockMutex
int wc_LockMutex(wolfSSL_Mutex* m)
{
/* Assume an infinite block, or should there be zero block? */
xSemaphoreTake( *m, portMAX_DELAY );
return 0;
}
示例9: check_child_role
child_status_type_t check_child_role(addrtype_t type, address_t address)
{
neighbor_info_t *b;
uint8_t i,j, length;
child_status_type_t return_value;
return_value = NOT_CHILD;
if( xSemaphoreTake( table_lock, ( portTickType ) 5 ) == pdTRUE )
{
switch (type)
{
case ADDR_802_15_4_PAN_SHORT:
/* Check if broadcast address */
length=4;
break;
case ADDR_802_15_4_SHORT:
/* Check if broadcast address */
length=2;
type=ADDR_802_15_4_PAN_SHORT;
break;
case ADDR_802_15_4_PAN_LONG:
length=8;
break;
default:
xSemaphoreGive( table_lock ); /*free lock*/
return return_value;
break;
}
if(neighbor_table.count > 0)
{
for(i=0; i < MAX_NEIGHBOR_COUNT ; i++)
{
b = &(neighbor_table.neighbor_info[i]);
if(b->type == ADDR_NONE)
b=0;
if(b && (b->type == type) )
{
if(memcmp(b->address, address,length) == 0)
{
if(b->child_dev == 0)
{
neighbor_table.child_count++;
b->child_dev=1;
}
return_value = CHILD;
i=MAX_NEIGHBOR_COUNT;
}
}
}
}
if((return_value==NOT_CHILD) && (neighbor_table.child_count == NWK_MAX_CHILD) )
{
return_value = DISCARD_ASSOC;
}
if((return_value==NOT_CHILD) && (neighbor_table.child_count < NWK_MAX_CHILD))
{
j =neighbor_table.child_count;
j++;
if(j == NWK_MAX_CHILD)
return_value=NO_CAPASITY_AFTER_NEW_CHILD;
}
xSemaphoreGive( table_lock ); /*free lock*/
}
return return_value;
}
示例10: update_routing_table
portCHAR update_routing_table(addrtype_t final_type, address_t final_destination,addrtype_t next_hop_type, address_t next_hop, uint8_t hop_count, int8_t last_rssi , uint8_t only_check)
{
uint8_t i=0,j, tmp_8=0, final_length, next_hop_length, compare=0, update=0;
route_info_t *ptr;
if( xSemaphoreTake( table_lock, ( portTickType ) 5 ) == pdTRUE )
{
if(final_type==ADDR_802_15_4_PAN_LONG)
final_length=8;
else
final_length=2;
if(next_hop_type==ADDR_802_15_4_PAN_LONG)
next_hop_length=8;
else
next_hop_length=4;
tmp_8 = 0;
/* Predict older route information and shuold use route */
if(only_check != REMOVE_ROUTE)
{
switch (check_time_stamp(final_type, final_destination))
{
case MESH_TTL_VALID:
tmp_8=1; /* cancel update process */
break;
case MESH_LOW_RSSI:
case MESH_NOT_NEIGHBOR:
only_check=0;
break;
default:
break;
}
}
if(routing_table.count > 0 && tmp_8==0)
{
for(i=0; i < MAX_ROUTE_INFO_COUNT ; i++)
{
ptr = &(routing_table.route_info[i]);
if(ptr->dest_addr_type == ADDR_NONE)
ptr=0;
/* Check originator address from routing table */
if(ptr && (final_type == ptr->dest_addr_type))
{
if(memcmp(ptr->destination, final_destination,final_length) ==0)
{
if(only_check == REMOVE_ROUTE)
{
ptr->dest_addr_type=ADDR_NONE;
routing_table.count--;
}
else
{
if(next_hop_type==ptr->next_hop_addr_type)
{
/* compare next hop address */
if(memcmp(next_hop, ptr->next_hop, next_hop_length) !=0)
compare=1;
else
update=2;
}
else
compare=1;
if(compare)
{
if(hop_count < ptr->hop_count && last_rssi > -85)
{
update=1;
}
else
{
if(hop_count==ptr->hop_count)
{
if(last_rssi > ptr->last_rssi || (ptr->ttl < (ROUTING_TTL - 2) ))
update=1;
}
}
}
if(update)
{
if(update != 2)
{
ptr->next_hop_addr_type = next_hop_type;
next_hop_length+=2;
/* added new next hop info */
for(j=0; j < next_hop_length ; j++)
{
ptr->next_hop[j] = next_hop[j];
}
}
ptr->last_rssi=last_rssi;
ptr->hop_count = hop_count;
ptr->ttl=ROUTING_TTL;
}
}
tmp_8=1;
i=MAX_ROUTE_INFO_COUNT;
}
}
}
//.........这里部分代码省略.........
示例11: update_neighbour_table
/**
* Update neighbor tables if necessary.
*
* Mac-layer use this function every time when received packet which LQI > 0.
*
* \param type indicates type of neighbor address mode
* \param address neighbor address
* \param lqi Last received LQI value
* \param last_sqn last MAC sqn from this address
*
* \return 1 when last_sqn is different than current
* \return 0 when sqn is same, now MAC discard packet
*/
uint8_t update_neighbour_table(addrtype_t type, address_t address, int8_t last_rssi, uint8_t last_sqn, uint8_t remove)
{
neighbor_info_t *b;
uint8_t i,j, sqn_check=0, length=0;
dest_delivery_t delivery_mode;
delivery_mode = NOT_NEIGHBOR;
if( xSemaphoreTake( table_lock, ( portTickType ) 5 ) == pdTRUE )
{
if(type==ADDR_802_15_4_PAN_LONG)
{
length=8;
}
if(type == ADDR_802_15_4_PAN_SHORT)
length=4;
delivery_mode = NOT_NEIGHBOR;
if(neighbor_table.count > 0 && remove != ADD_CHILD)
{
for(i=0; i < MAX_NEIGHBOR_COUNT ; i++)
{
b = &(neighbor_table.neighbor_info[i]);
if(b->type == ADDR_NONE)
b=0;
if(b && (type == b->type))
{
if(memcmp(b->address, address,length) == 0)
delivery_mode = NEIGHBOR;
/* Update lqi and compare sqn to old one */
if( delivery_mode == NEIGHBOR )
{
if(type != ADDR_802_15_4_PAN_SHORT)
{
for(j=0; j<2; j++)
{
b->address[length+j] = address[length+j];
}
}
if(remove == REMOVE_NEIGHBOUR)
{
if(b->child_dev)
neighbor_table.child_count--;
b->type=ADDR_NONE;
i=neighbor_table.count;
neighbor_table.count--;
}
else
{
/* Duplicated packet check */
if(b->last_sqn != last_sqn)
{
b->last_sqn = last_sqn;
sqn_check=1;
}
b->last_rssi = last_rssi;
b->ttl=TTL;
}
i=MAX_NEIGHBOR_COUNT;
}
}
}
}
/* Add new neighbor if addresstype is source */
if((delivery_mode == NOT_NEIGHBOR && remove != REMOVE_NEIGHBOUR) && neighbor_table.count < MAX_NEIGHBOR_COUNT)
{
for(i=0; i<MAX_NEIGHBOR_COUNT; i++)
{
b = &(neighbor_table.neighbor_info[i]);
if(b->type == ADDR_NONE)
{
i=MAX_NEIGHBOR_COUNT;
}
}
if(type==ADDR_802_15_4_PAN_LONG)
length+=2;
for(j=0; j < length ; j++)
{
b->address[j] = address[j];
}
/* add lqi value to neighbor */
if(remove == ADD_CHILD)
//.........这里部分代码省略.........
示例12: xSemaphoreTake
void AnalyzerControl::AnalysisRead()
{
xSemaphoreTake(_semaphore, portMAX_DELAY);
WakeAnalysisRequest();
}
示例13: SetWidgetList
void SetWidgetList(tMessage *pMsg)
{
static Widget_t *pCurrWidget = NULL; // point to Widget in current Widget[]
static Widget_t *pNextWidget = NULL; // point to Widget in new Widget[]
static unsigned char ChangedClockWidget = INVALID_ID;
xSemaphoreTake(SramMutex, portMAX_DELAY);
WidgetList_t *pMsgWgtLst = (WidgetList_t *)pMsg->pBuffer;
unsigned char WidgetNum = pMsg->Length / WIDGET_HEADER_LEN;
unsigned char i = 0;
PrintF(">SetWLst I:%d %s %d %s %d", WGTLST_INDEX(pMsg->Options), "T:", WGTLST_TOTAL(pMsg->Options), "Num:", WidgetNum);
for(; i<WidgetNum; ++i) {PrintH(pMsgWgtLst[i].Id); PrintH(pMsgWgtLst[i].Layout);} PrintR();
if (pNextWidget == NULL) // first time call, only add widgets
{
pCurrWidget = pCurrWidgetList;
pNextWidget = &Widget[0];
}
else
{
if (WGTLST_INDEX(pMsg->Options) == 0 &&
(pCurrWidget != pCurrWidgetList || (pNextWidget != &Widget[0] && pNextWidget != &Widget[MAX_WIDGET_NUM])))
{ // last SetWLst failed in the middle.Clean up whole list
PrintS("# Last SetWgtLst broken!");
pCurrWidget = pCurrWidgetList;
pNextWidget = &Widget[0] + (&Widget[MAX_WIDGET_NUM] - pCurrWidgetList);
}
}
while (WidgetNum) // number of list items
{
/* old clock widgets */
if (!IS_CLOCK_WIDGET(pMsgWgtLst->Layout) && pMsgWgtLst->Id <= CLOCK_WIDGET_ID_RANGE) TestFaceId(pMsgWgtLst);
unsigned char Change = GetWidgetChange(pCurrWidget->Id, pCurrWidget->Layout, pMsgWgtLst->Id, pMsgWgtLst->Layout);
switch (Change)
{
case WGT_CHG_CLK_FACE:
PrintS("Chg ClkFce");
if (ON_CURRENT_PAGE(pMsgWgtLst->Layout)) ChangedClockWidget = pMsgWgtLst->Id;
case WGT_CHG_SETTING:
//cpy layout to curr; cpy curr to next; msg, curr, next ++
PrintF("=%02X", pCurrWidget->Id);
pCurrWidget->Id = pMsgWgtLst->Id;
pCurrWidget->Layout = pMsgWgtLst->Layout;
*pNextWidget++ = *pCurrWidget++;
pMsgWgtLst ++;
WidgetNum --;
break;
case WGT_CHG_CLK_ADD:
PrintS("+Clk");
if (ON_CURRENT_PAGE(pMsgWgtLst->Layout)) ChangedClockWidget = pMsgWgtLst->Id;
case WGT_CHG_ADD: //pCurrWidget->Id > pMsgWgtLst->Id)
// add new widget: cpy msg to next; msg and next ++; curr stays
PrintF("+%02X", pMsgWgtLst->Id);
pNextWidget->Id = pMsgWgtLst->Id;
pNextWidget->Layout = pMsgWgtLst->Layout;
AssignWidgetBuffer(pNextWidget);
pNextWidget ++;
pMsgWgtLst ++;
WidgetNum --;
break;
case WGT_CHG_REMOVE:
// remove widget: curr ++
PrintF("-%02X", pCurrWidget->Id);
FreeWidgetBuffer(pCurrWidget);
pCurrWidget ++;
break;
default: break;
}
}
PrintR();
// if part index + 1 == parts, SetWidgetList complete
if (WGTLST_TOTAL(pMsg->Options) == WGTLST_INDEX(pMsg->Options) + 1)
{
// PrintS("C:");
// for (i=0; pCurrWidgetList[i].Id != INVALID_ID && i < MAX_WIDGET_NUM; ++i) PrintH(pCurrWidgetList[i].Id);
// PrintR();
while (pCurrWidget->Id != INVALID_ID && pCurrWidget < &pCurrWidgetList[MAX_WIDGET_NUM])
{
FreeWidgetBuffer(pCurrWidget);
pCurrWidget->Id = INVALID_ID;
pCurrWidget ++;
}
for (i = 0; i < MAX_WIDGET_NUM; ++i)
{
if (pCurrWidgetList[i].Id != INVALID_ID)
//.........这里部分代码省略.........
示例14: logRunBlock
/* This function is usually called by the worker subsystem */
void logRunBlock(void * arg)
{
struct log_block *blk = arg;
struct log_ops *ops = blk->ops;
static CRTPPacket pk;
unsigned int timestamp;
xSemaphoreTake(logLock, portMAX_DELAY);
timestamp = ((long long)xTaskGetTickCount())/portTICK_RATE_MS;
pk.header = CRTP_HEADER(CRTP_PORT_LOG, LOG_CH);
pk.size = 4;
pk.data[0] = blk->id;
pk.data[1] = timestamp&0x0ff;
pk.data[2] = (timestamp>>8)&0x0ff;
pk.data[3] = (timestamp>>16)&0x0ff;
while (ops)
{
float variable;
int valuei = 0;
float valuef = 0;
// FPU instructions must run on aligned data. Make sure it is.
variable = *(float *)ops->variable;
switch(ops->storageType)
{
case LOG_UINT8:
valuei = *(uint8_t *)&variable;
break;
case LOG_INT8:
valuei = *(int8_t *)&variable;
break;
case LOG_UINT16:
valuei = *(uint16_t *)&variable;
break;
case LOG_INT16:
valuei = *(int16_t *)&variable;
break;
case LOG_UINT32:
valuei = *(uint32_t *)&variable;
break;
case LOG_INT32:
valuei = *(int32_t *)&variable;
break;
case LOG_FLOAT:
valuei = *(float *)&variable;
break;
}
if (ops->logType == LOG_FLOAT || ops->logType == LOG_FP16)
{
if (ops->storageType == LOG_FLOAT)
valuef = *(float *)&variable;
else
valuef = valuei;
// Try to append the next item to the packet. If we run out of space,
// drop this and subsequent items.
if (ops->logType == LOG_FLOAT)
{
if (!appendToPacket(&pk, &valuef, 4)) break;
}
else
{
valuei = single2half(valuef);
if (!appendToPacket(&pk, &valuei, 2)) break;
}
}
else //logType is an integer
{
if (!appendToPacket(&pk, &valuei, typeLength[ops->logType])) break;
}
ops = ops->next;
}
xSemaphoreGive(logLock);
// Check if the connection is still up, oherwise disable
// all the logging and flush all the CRTP queues.
if (!crtpIsConnected())
{
logReset();
crtpReset();
}
else
{
crtpSendPacket(&pk);
}
}
示例15: FreeRTOS_UART_write
//------------------------------------------------------------------------------------
size_t FreeRTOS_UART_write( Peripheral_Descriptor_t const pxPeripheral, const void *pvBuffer, const size_t xBytes )
{
// Esta funcion debe poner los caracteres apuntados en pvBuffer en la cola de trasmision.
// Actua como si fuese rprintfStr.
// Debe tomar el semaforo antes de trasmitir. Los semaforos los manejamos en la capa FreeRTOS
// y no en la de los drivers.
char cChar;
char *p;
size_t bytes2tx;
Peripheral_Control_t * const pxPeripheralControl = ( Peripheral_Control_t * const ) pxPeripheral;
UART_device_control_t *pUart;
size_t wBytes = 0;
pUart = pxPeripheralControl->phDevice;
// Controlo no hacer overflow en la cola de trasmision
bytes2tx = xBytes;
// Espero el semaforo en forma persistente.
while ( xSemaphoreTake(pxPeripheralControl->xBusSemaphore, ( TickType_t ) 1 ) != pdTRUE )
taskYIELD();
// Trasmito.
// Espero que los buffers esten vacios. ( La uart se va limpiando al trasmitir )
if ( pUart->txBufferType == QUEUE ) {
while ( uxQueueMessagesWaiting( pUart->txStruct ) > 0 )
taskYIELD();
} else {
while ( uxFifoMessagesWaiting( pUart->txStruct ) > 0 )
taskYIELD();
}
// Cargo el buffer en la cola de trasmision.
p = (char *)pvBuffer;
while (*p && (bytes2tx-- > 0) ) {
// Voy cargando la cola de a uno.
cChar = *p;
pv_enqueue( pUart, &cChar );
p++;
wBytes++; // Cuento los bytes que voy trasmitiendo
// Si la cola esta llena, empiezo a trasmitir y espero que se vacie.
if ( pv_queueReachHighWaterMark(pUart) ) {
// Habilito a trasmitir para que se vacie
vUartInterruptOn(pxPeripheralControl->portId);
// Y espero que se haga mas lugar.
while ( ! pv_queueReachLowWaterMark(pUart) )
taskYIELD();
}
}
// Luego inicio la trasmision invocando la interrupcion.
vUartInterruptOn(pxPeripheralControl->portId);
xSemaphoreGive( pxPeripheralControl->xBusSemaphore );
//return xBytes; // Puse todos los caracteres en la cola.
return (wBytes);
}