FreeRTOS隊列操作

來源:互聯網
上載者:User

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); //如果需要的話進行一次任務切換    }}

實驗現象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.