当任务往消息队列中发送消息时,可选择只将该消息发送给一个任务。当前等待消息的任务中只有最高优先级的那个将接收到消息,或最先进入等待消息列表的(同优先级)任务。
注:也可选择以广播的形式发送消息,那么所有“等待此消息的”任务都将获得该消息。
如果没有任务在等待消息队列的消息,则发送消息时会判断消息队列当前是否已满 。
1.1.2 从消息队列接收消息
消息队列中已存在消息,通过内核服务将消息传递给等待消息的任务中优先级最高的任务,或最先进入等待消息任务列表的(同优先级)任务。
如果消息队列为空,则等待消息的任务被放入等待消息的任务列表中,直到有其它任务向消息队列发送消息后,该任务才能结束等待状态或在等待超时的情况下运行。
OSQPend()
函数允许用户定义一个最长的等待时间Timeout
作为它的参数,这样可以避免该任务无休止地等待下去。
内核提供以下消息队列服务:
- 等待消息的到来(PEND);
- 将消息放入队列中去(POST);
- 清空消息队列
- 消息队列初始化,队列初始化时总是清为空;
与信号量相比,消息队列不仅可以实现同步,而且通过缓冲的方式来传递多个数据信息,从而避免了信息的丢失或混乱。
1.2 消息队列的状态
消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。
1.3 消息队列的工作方式
1.一对一
2.多对一
3.一对多
多对多与全双工的工作方式也可实现,但不常见。
1.3 数据通信
让一个LED以传递过来的参数确定点亮时间,以此示例来说明如何使用消息队列来实现任务之间的数据通信,假设TaskLED
为高优先级的任务。两个任务的处理流程如下。
LED
任务的代码如下。
发送延时参数任务SendDly
的代码如下。
1.4 多任务接收数据
为了说明如何使用消息队列来实现多任务接收数据,我们设计一个系统,按键一按下,LED按照指定节奏闪烁,蜂鸣器按照指定节奏鸣响。三个任务的处理流程如下。
1.5 任务间同步
TaskKEY
任务主要代码如下。
LED
任务的代码如下。
Beep
任务主要代码如下。
1.6 任务消息队列
在μC/OS-III中,每个任务都有它自己的内嵌消息队列,称为任务消息队列。任务消息队列是在任务创建OSTaskCreate()
时创建的,因此任务创建之后便可以直接使用。
任务消息队列使用起来更方便。
当用户明确知道该给哪个任务发消息时,此时就可以使用任务消息队列。
μC/OS-III中的任务消息队列服务函数以OSTaskQ???()
命名。
使用任务消息队列做任务间的通信,可参考示例程序:“Micrium_CY8CKIT-050B_uCOS-III-Q_GNU(PSoC Creator 4.0).rar”
1.7生产者消费者模型
使用一个计数型信号量,初值为允许生产者发布的消息数目。如:消费者最多缓存10则消息,则该计数型信号量的初值为10。
2 动态内存管理
2.1 简介
ANSI C中,可以使用malloc()
和free()
两个函数来动态分配内存,在嵌入式系统中,它们一般也是可用的,但并不适合。如图为被两个函数分配过的内存区。
为了避免上面的问题,μC/OS-III自己设计了一套动态内存分配系统。μC/OS-III的动态内存分配是以块为单位分配的,一次只能分配一个块,块的大小可以由用户来定义。
μC/OS-III的动态内存管理是数据队列的绝佳伴侣,配合使用异常方便 。
2.2 函数列表
将os_cfg.h中的宏OS_CFG_MEM_EN
设置为1即可使能存储管理服务。
动态内存管理的3个系统函数:
2.3 数据通信
让一个LED以传递过来的参数确定点亮时间,以此示例来说明如何用动态内存管理来实现数据通信。两个任务的处理流程如下。
LED
任务的代码如下。
发送消息任务SendDly
的代码如下。
3 定时器管理
3.1 简介
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
链图片转存中…(img-n4giWR2v-1715626652600)]
[外链图片转存中…(img-qQKYQDLW-1715626652601)]
[外链图片转存中…(img-XuwixwGy-1715626652601)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!