- 简述
- 任务消息队列与任务信号量相同,均隶属于某一个特定任务,不需要单独创建
- 任务在消息队列在,只有该任务才可以接收这个任务消息队列的信息,其它任务只能给这个任务发送信息
- 优缺点
- 优:处理速度快、RAM开锁小
- 缺:只能指定消息发送的对象,只有一个任务接收
- 相关函数
- OSTaskQPost(); 任务消息队列发送函数
- OSTaskQPend(); 任务消息队列获取函数
- 例程
- 发送
/************************************************** * 函数名:static void AppTaskKey(void *p_arg) * 描述 :按键检测 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskKey(void *p_arg) { OS_ERR err; (void)p_arg; for(;;) { OSTaskQPost( (OS_TCB *)&AppTaskLedTCB, //目标任务控制块 (void *)"dreamer uC/OS-III", //消息内容 (OS_MSG_SIZE )sizeof("dreamer uC/OS-III"), // 消息长度 (OS_OPT )OS_OPT_POST_FIFO, //发送到任务消息队列的入口 (OS_ERR *)&err); //返回错误类型 OSTimeDlyHMSM ( 0, 0, 1, 0, OS_OPT_TIME_DLY, & err ); //每1s发送一次 } }
- 接收
/************************************************** * 函数名:static void AppTaskLed(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskLed(void *p_arg) { OS_ERR err; CPU_INT32U cpu_clk_freq; CPU_TS ts; OS_MSG_SIZE msg_size; char * pMsg; (void)p_arg; cpu_clk_freq = BSP_CPU_ClkFreq(); //获取系统时钟 for(;;) { pMsg = OSTaskQPend( (OS_TICK )0, //无期限等待 (OS_OPT )OS_OPT_PEND_BLOCKING, //没有消息任务就阻塞 (OS_MSG_SIZE *)&msg_size, //返回消息长度 (CPU_TS *)&ts, //返回消息被发送的时间戳 (OS_ERR *)&err); //返回错误类型 ts = OS_TS_GET() - ts; //计算时间差 LED1_TOGGLE; printf("\r\n 接收到的消息内容为: %s,长度是: %d 字节 \r\n", pMsg,msg_size); printf("\r\n 任务消息从被发送到被接收的时间差是: %d us \r\n", ts / (cpu_clk_freq / 1000000)); } }
- 发送
- 下载验证
- 总结
- 实际通信中,一个或多个任务发送一个消息给另个任务非常常见,很适合用任务消息队列传递消息
- 一个任务给多个任务发送消息的情况相对比较少
- 如果任务消息队列可以满足设计需求,尽量不要使用普通消息队列
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【10】uC/OS-III应用开发————>任务消息队列(STM32F767)
最新推荐文章于 2024-03-05 22:32:27 发布