FreeRTOS队列操作
2018-02-02 15:04
417 查看
API函数
使用举例
实验现象
点击按键
中断相关API函数
使用举例
实验现象
//创建 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) #endif QueueHandle_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); //如果需要的话进行一次任务切换 } }
实验现象
相关文章推荐
- 补完链队列的其它常见操作
- C#操作消息队列
- 基于接口和队列的线程操作UI方式
- 蓝桥杯 算法提高 队列操作
- 顺式队列(循环队列)8种操作的实现
- CF 19C 后缀数组O(1)判Repeats ,优先队列模拟操作+map离散
- c++中栈,队列的函数操作
- 队列 基本操作。
- FreeRTOS系列第17篇---FreeRTOS队列
- 最小优先队列基本操作
- 一个简单易用的低功耗蓝牙框架。兼容性好、适配到 6.0、适配小米三星手机、操作简单、支持连发无需延时、自带队列管理、支持多通知
- 队列操作
- JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
- 队列的入队、出队基本操作
- bzoj4504: K个串【主席树区间操作+优先队列】
- C语言 链队列基本操作
- java 多线程+队列 ping 操作
- 多线程 队列的简单操作
- 实验4:栈和队列的基本操作实现及其应用之《排号叫号管理》
- C++:用两个栈来实现一个队列,完成队列的Push和Pop操作