超级版主
- 积分
- 4666
- 金钱
- 4666
- 注册时间
- 2019-5-8
- 在线时间
- 1224 小时
|
本帖最后由 正点原子运营 于 2021-11-1 10:41 编辑
以下文章摘自微信公众号——开源电子网《初学者如何选择RTOS功能?》
更多技术文章,请扫下方二维码关注
RTOS可以说是现在学习嵌入式必修的一门科目,由于它占用资源小、支持多任务等特点,常被用于工业控制、智能家居中。但当初学者学习完一种RTOS(例如UCOS,Free-RTOS,RT-Thread)后,会发现RTOS支持的功能十分多,有信号量、邮箱、事件、消息队列…,在实际的应用中,也会有这种困惑—那就是我该选取哪种RTOS功能在我的项目中?那么本文就带你梳理一下RTOS常见的功能,以及在实际应用中,该如何选取RTOS的功能。 文章针对初学者而写,文本的语言都采用通俗易懂的方式,如有高手路过,可以继续赶路。
先看一下RTOS的常见功能都有哪些?下面列举了一下RTOS常见功能。
① 信号量
② 互斥锁
③ 自旋锁
④ 消息队列
⑤ 工作队列
⑥ 事件
⑦ 邮箱
看到上面这么多种功能,初学者可能就会比较蒙的,其实我们可以简单划分一下上面这些功能的使用场合,我们分成两类,第一类是以访问控制为主,第二类是以消息的传递为主。(有些RTOS功能可能具有上述两类的特征,那我们就按照常见的使用场合划分它)那么第一类就是信号量、互斥锁、自旋锁、事件。第二类就是消息队列、工作队列、邮箱。
首先来个简单的图示,说明一下这两类的关系和联系(不准确的描述,针对初学者)。
这样一梳理起来想必你就没那么乱了,那么下面我们再具体分析一下各种类之间的区别和如何选用RTOS功能。
01 以访问控制为主的RTOS功能之间的区别
以访问控制为主的RTOS功能的作用一般是进行资源的管理和任务的同步。简单来理解一下,资源管理就像你的开发板只有一块LCD屏幕,有一个任务想控制LCD显示全黑,但是另一个任务想控制LCD显示全白,两个任务同时执行,那么LCD到底是显示黑色还是白色啊?这是自相矛盾的。
而任务的同步就像一个任务是用来初始化LED,另一个任务是使LED亮起来,那么两个任务同时执行,如果初始化LED的任务没有执行,那另外一个任务就不能使LED亮起来。对于上述两种情况,我们就要用到RTOS的一些功能进行访问控制或者任务同步,这样不同任务间才能“协调办事”。
1, 先看一下信号量,这是个简单高效的RTOS功能,大致的原理你可以理解为用一个变量进行访问控制,变量为负数,就是该资源不可用/任务未完成,变量为正就是资源可用/其它任务可继续进
行。
2, 互斥信号量,相当于加入优先级调整的信号量,获取到信号量的任务的优先级可以被提高。
3, 自旋锁,主要解决处理器是多内核的情况,可以大概认为是信号量的加强版,但效率没有信号量这么高。
4, 事件,这个常用在多任务的同步,信号量一般是单个任务与单个任务同步,事件简单点理解就是多信号量,有一个任务同意我运行还不行,还得等待另一个任务的同意。
总结一下,如果我们做一个项目,任务间要同步或者资源要管理,该选择哪一个?那得看你在什么场合使用了。如果使用的是多内核的CPU,首先考虑自旋锁。如果是单核CPU首先考虑互斥信号量(因为它带优先级调整策略)。以STM32做主控芯片为例,首先考虑互斥信号量,但是如果你并不在乎这点优先级的效率,那就考虑信号量(简单高效),如果任务的同步或者资源需求比较复杂,那就考虑一下使用事件这种功能。
02 以消息传递为主的RTOS功能之间的区别
以消息传递为主的RTOS功能,最重要的当然是任务间的通讯问题,例如有一个任务控制着LCD显示温度、湿度、大气压等信息,而第二个任务就是采集温度、湿度和大气压的信息,那么第二个任务就要发消息告诉第一个任务自己获得的消息(他们之间其实也有着访问控制功能,不然第一个任务就不知道自己显示什么了,此处我们认为它的功能是以传递消息为主)。
1, 先看一下消息队列,大致可以理解成将消息组成队列,然后发送,这种方式较简单高效。
2, 邮箱,简单理解就是消息队列的简化版,发送的消息一般是定长的,简化的目的就是让效率再高一点。
3, 工作队列,这个很特殊,严格来讲,它是发消息给系统,让系统延时或者不延时执行某个函数。
总结一下,如果我们做一个项目,任务间要传递消息,那么该选择哪一个RTOS功能比较好?那也是得看应用场合。通常先考虑邮箱,因为它最高效嘛,但是如果要发送的消息太长,那就选择消息队列。如果要通知系统执行某些任务,那就先考虑工作队列了。
|
|