一、 uCOSII消息队列封装
1 消息队列概念
消息队列就象一个类似于缓冲区的对象,通过消息队列任务和ISR发送和接收消息,实现数据的通信和同步。消息队列具有一定的容量,可以容纳多条消息,因此可以看成是多个邮箱的组合。
一般来说,消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。
2 消息队列封装
在ksdk_ucosii_lib库项目下的fsl_os_abstraction.h里,定义了4个消息队列相关的接口:
msg_queue_handler_t OSA_MsgQCreate(msg_queue_t *queue,
uint16_t message_number,
uint16_t message_size);
osa_status_t OSA_MsgQPut(msg_queue_handler_t handler, void* pMessage);
osa_status_t OSA_MsgQGet(msg_queue_handler_t handler,
void *pMessage,
uint32_t timeout);
osa_status_t OSA_MsgQDestroy(msg_queue_handler_t handler);
而在fsl_os_abstraction_ucosii.h文件中,进行了具体实现:
(1)消息队列创建函数,封装了uCOSII中的OSQCreate函数。
(2)消息队列等待函数,封装了uCOSII中的OSQPend函数。
(3)消息队列发送函数,封装了uCOSII中的OSQPost函数。
(4)消息队列销毁函数,封装了uCOSII中的OSQDel函数。
二、uCOSII中消息队列的使用
1 示例
让一个LED以传递过来的参数确定点亮时间,以此示例来说明如何使用消息队列来实现任务之间的数据通信,假设TaskLED为高优先级的任务。两个任务的处理流程如下。
2 代码实现
(1)在主函数中,创建两个任务,一个发送控制Led的闪烁频率,一个接收消息并控制Led的闪烁
(2)发送消息队列任务
(3)接收消息队列,控制Led
3 效果
(1)串口数据
(2)MAPS-K64
|