API函數
//建立#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )#endifQueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking )//隊列剩餘大小UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )//隊列使用大小UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue )
使用舉例
QueueHandle_t Key_Queue //按索引值訊息佇列控制代碼void start_task(void *pvParameters){ Key_Queue = xQueueCreate(1, sizeof(u8)); if(Key_Queue == 0) { printf("xQueueCreate err\r\n"); }}void key_task(void *pvParameters){ BaseType_t ret; while(1) { key = KEY_Scan(0); //掃描按鍵 if((Key_Queue != 0) && (key)) //訊息佇列Key_Queue建立成功,並且按鍵被按下 { ret = xQueueSend(Key_Queue, &key, 10); if(ret != pdPASS) //發送按索引值 { printf("xQueueSend err\r\n"); } } vTaskDelay(10); }}void recv_task(void *pvParameters){ while(1) { if(Key_Queue != 0) { if(xQueueReceive(Key_Queue, &key, portMAX_DELAY)) { printf("recv_task key %d\r\n", key); } } }}
實驗現象
點擊按鍵
中斷相關API函數
#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken )
使用舉例
void start_task(void *pvParameters){ Message_Queue = xQueueCreate(1, sizeof(u8)); if(Message_Queue == 0) { printf("xQueueCreate err\r\n"); }}void USART1_IRQHandler(void){ u8 Res; BaseType_t xHigherPriorityTaskWoken; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { Res = USART_ReceiveData(USART1); xQueueSendFromISR(Message_Queue, &Res, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //如果需要的話進行一次任務切換 }}void TIM2_IRQHandler(void){ u8 Res; BaseType_t ret; BaseType_t xTaskWokenByReceive = pdFALSE; if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ret = xQueueReceiveFromISR(Message_Queue, &Res, &xTaskWokenByReceive); if(ret == pdTRUE) { printf("xQueueReceiveFromISR Res %c\r\n", Res); } portYIELD_FROM_ISR(xTaskWokenByReceive); //如果需要的話進行一次任務切換 }}
實驗現象