完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
转rtx操作系统
前面几个章节主要给大家讲解了任务间的同步和资源共享机制,本章节为大家讲解任务间的通信机制消息邮箱,RTX的消息邮箱其实就是消息队列,注意和uCOS-II中的消息邮箱区分开,uCOS-II的消息邮箱只能实现一个数据的传递。这里的消息邮箱可以实现多个数据的传递。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。 16.1 消息邮箱 16.2 消息邮箱API函数 16.3 实验例程说明(任务间通信) 16.4 实验例程说明(中断方式通信) 16.5 总结 16.1 消息邮箱 16.1.1 消息邮箱的概念及其作用 RTX的消息邮箱实际上就是消息队列,通过内核提供的服务,任务或中断服务子程序可以将一个消息(注意,RTX消息邮箱传递的是消息的地址而不是实际的数据)放入到消息队列。同样,一个或者多个任务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO)。 也许有不理解的初学者会问采用消息邮箱多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程时,使用全局数组的确比较方便,但是在加上RTOS后就是另一种情况了。使用全局数组相比消息邮箱主要有如下四个问题: u 使用消息邮箱可以让RTOS内核有效的管理任务,全局数组是无法做到的,任务的超时等机制需要用户自己去实现。 u 使用了全局数组就要防止多任务的访问冲突,使用消息邮箱已经处理好了这个问题。用户无需担心。 u 使用消息邮箱可以有效的解决中断服务程序跟任务之间消息传递的问题。 u FIFO机制更有利于数据的处理。 |
|
|
相关推荐
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
|
RTX任务创建:
复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */ 1, /* 任务优先级 */ &AppTaskUserIFStk, /* 任务栈 */ sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskLEDStk, /* 任务栈 */ sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */ HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */ 3, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ } |
|
|
|
|
|
|
|
|
创建消息邮箱:
复制代码 /* 声明一个支持10个消息的消息邮箱 */ os_mbx_declare (mailbox, 10); /* ********************************************************************************************************* * 函 数 名: AppObjCreate * 功能说明: 创建任务通信机制 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppObjCreate (void) { /* 创建消息邮箱 */ os_mbx_init (&mailbox, sizeof(mailbox)); } |
|
|
|
|
|
|
|
|
定时器中断回调函数中实现消息邮箱数据发送:
定时器中断的初始化和中断函数在bsp_timer.c文件中实现,这个不是教程的重点,故不作介绍。这里主要关心RTX的消息邮箱函数在中断服务程序中的使用方法。 复制代码 /* 特别注意,RTX消息邮箱传递的是地址。 所以不要将变量定义放在中断程序中,退出中断后变量空间会释放给系统堆栈。 */ static uint8_t s_ucCount = 0; static void TIM_CallBack1(void) { /* 如果消息邮箱还有空间,向消息邮箱发送数据 */ if (isr_mbx_check (&mailbox) != 0) { s_ucCount++; isr_mbx_send (&mailbox, &s_ucCount); } } |
|
|
|
|
|
|
|
|
16.4.2 STM32F407开发板实验
配套例子: V5-415_RTX实验_消息邮箱(中断方式) 实验目的: 1. 学习RTX的消息邮箱(中断方式) 实验内容: 1.K1按键按下,串口打印。 2.K2键按下,启动单次定时器中断,50ms后在定时器中断给任务AppTaskMsgPro发送消息邮箱数据。任务AppTaskMsgPro接收到消息后进行消息处理。 3.各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待定时器中断发来的消息邮箱数据。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务 AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待定时器中断发来的消息邮箱数据。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 |
|
|
|
|
|
|
|
|
程序设计:
u 任务栈大小分配: staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */ staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskStartStk[512/8]; /* 任务栈 */ 将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
|
RTX任务创建:
复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */ 1, /* 任务优先级 */ &AppTaskUserIFStk, /* 任务栈 */ sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskLEDStk, /* 任务栈 */ sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */ HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */ 3, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ } |
|
|
|
|
|
|
|
|
创建消息邮箱:
复制代码 /* 声明一个支持10个消息的消息邮箱 */ os_mbx_declare (mailbox, 10); /* ********************************************************************************************************* * 函 数 名: AppObjCreate * 功能说明: 创建任务通信机制 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppObjCreate (void) { /* 创建消息邮箱 */ os_mbx_init (&mailbox, sizeof(mailbox)); } |
|
|
|
|
|
|
|
|
定时器中断回调函数中实现消息邮箱数据发送:
定时器中断的初始化和中断函数在bsp_timer.c文件中实现,这个不是教程的重点,故不作介绍。这里主要关心RTX的消息邮箱函数在中断服务程序中的使用方法。 复制代码 /* 特别注意,RTX消息邮箱传递的是地址。 所以不要将变量定义放在中断程序中,退出中断后变量空间会释放给系统堆栈。 */ static uint8_t s_ucCount = 0; static void TIM_CallBack1(void) { /* 如果消息邮箱还有空间,向消息邮箱发送数据 */ if (isr_mbx_check (&mailbox) != 0) { s_ucCount++; isr_mbx_send (&mailbox, &s_ucCount); } } |
|
|
|
|
|
|
|
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
140 浏览 0 评论
483 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
815 浏览 0 评论
1346 浏览 2 评论
804 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16904 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 20:25 , Processed in 0.908017 second(s), Total 71, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖