银川建立网站,上海工商查询网,到哪里学平面设计,114做网站#xff08;后文有修改#xff09;
一、思路
USARTDMA空闲中断发生后#xff0c;将接收到的DMA消息用消息队列发出去xQueueSendToFrontFromISR#xff0c;FreeRTOS创建一个独立的任务一直等待接受消息队列。
DMA中断可以被FreeRTOS管理。
二、CubeMx配置驱动
2.1 USAR…后文有修改
一、思路
USARTDMA空闲中断发生后将接收到的DMA消息用消息队列发出去xQueueSendToFrontFromISRFreeRTOS创建一个独立的任务一直等待接受消息队列。
DMA中断可以被FreeRTOS管理。
二、CubeMx配置驱动
2.1 USARTDMA FreeRTOS设置的中断管理范围为515USART中断应该在该范围内此处设计为7。 2.2 FreeRTOS创建UsartRx 任务创建消息队列Queue生成代码。 三、修改代码
3.1 usart.c
1增加引用和定义 2编写中断处理函数 3.2 XXXit.c 3.3 FreeRTOS.c
修改CubeMx创建的usartRxMsgQueueHandle指定为队列深度为3单个Item大小为sizeof(USART_RECEIVETYPE)。 MX_FREERTOS_Init(void)执行结束后将isFreeRTOSSysOn设置为1通知串口中断处理程序启用xQueueSendToFrontFromISR。
最后在usartRxFunc任务函数入口编写串口数据业务处理逻辑调用xQueueReceive一直阻塞等待。 四、消息队列的使用方式
1、使用队列添加引用#include queue.h2、初始化osMessageQueueId_t usartRxMsgQueueHandle;
const osMessageQueueAttr_t usartRxMsgQueue_attributes {.name usartRxMsgQueue
};usartRxMsgQueueHandle osMessageQueueNew (3, sizeof(USART_RECEIVETYPE), usartRxMsgQueue_attributes);3、发送队列消息
1中断函数中发送队列消息
xQueueSendToFrontFromISR、xQueueSendToBackFromISR、xQueueOverwriteFromISR、xQueueSendFromISR、xQueueGenericSendFromISR等
e.g.
xxxISR(void)
{BaseType_t xHigherPriorityTaskWoken pdFALSE;...xQueueSendToFrontFromISR(usartRxMsgQueueHandle,Uart1Rx,xHigherPriorityTaskWoken);...portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
(2)普通函数中发送队列消息
xQueueSendToFront、xQueueSendToBack、xQueueOverwrite、xQueueSend、xQueueGenericSend等4、等待、查询接受队列消息
1中断函数中查询队列消息
xQueuePeekFromISR等2普通函数中等待查询队列消息
xQueueReceive、uxQueueMessagesWaiting、xQueuePeek、uxQueueSpacesAvailable等2021 09 22 补充
以上实现队列使用方法是基于cmsis_os对于cmsis_os2已经不需要考虑接口是否是FromISR直接使用osMessageQueuePut接口即可。如下