我是靠谱客的博主 有魅力凉面,最近开发中收集的这篇文章主要介绍RTOS行为同步,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先我认为学习一个系统和开车是一样的,我们的目的是会开车上路,而不是怎么去修理车,我们只要知道车上的按键和各种功能我们熟练使用就达到了目的,就像学习一个系统,我们对它的零部件熟悉了,会在我们的产品里用到就达到目的了。
没必要一上来就研读源码,没有意义,就像你买了个新车,一回家就开始研究怎么修理。至于怎么修理那是车遇到问题才用的,研读源码是你达到了那个水平自然的事情

1、RTOS提供的行为同步方法有:信号量、消息队列、消息邮箱、事件组、任务通知。(二值信号量是计数信号量数目为1的特殊形式,消息邮箱是消息队列容量为1的特殊形式)。
下面谈谈我对 这几个同步方法选取的理解:
a、在不涉及到数据传输的情况下,可以选择信号量、事件、消息邮箱(传入bool可代替二值信号量)、任务通知。

b、涉及到数据传输可选消息邮箱(数据量为1)、消息队列.

c、在保证消息生产时间慢于消息消费时间的前提下首选二值信号量、事件、消息邮箱、任务通知。相反,无法保证这个前提就用具有缓冲功能的计数信号量代替二值信号量,消息队列代替消息邮箱。
这么做的原因是计数信号量和消息队列都可以解决临时堆积问题。计数信号量能保证每个信号都能接收到而不会错过。

d、当同步信号为多个信号的逻辑关系时选用事件。

e、二值和计数的选取区别在于能否保证消息生产时间慢于消息消费时间,能的话选二值,不能的话选计数。
二值信号量不能解决信号积压的问题,未及时响应的信号将会被新产生的信号替代,使有效信号的响应次数少于系统实际发出的。
计数信号量保证每次控制信号及时响应(响应时间偶尔延迟)
具体动作:释放信号量资源,信号量数值加 1, 此时信号量计数值为 1,任务 Task1由阻塞态进入到就绪态,在调度器的作用下由就绪态又进入到运行态, 任务 Task1 获得信号量后,信号量数值减 1, 此时信号量计数值又变成了 0.

f、消息队列和消息邮箱的选取,消息邮箱只能存取一个消息,且要保证消息生产时间慢于消息消费时间。
消息队列对消息数量没有限制,

但也要保证消息生产平均时间慢于消息消费平均时间。

g、任务和ISR之间通信是尽量保证ISR触发的任务优先级足够高,能及时运行。

h、任务和任务之间通信也涉及到优先级问题,如果控制任务优先级小于被控制任务优先级,那么能保证被控制任务及时运行。如果这两个任务优先级相反,那么被控任务优先级就不能及时运行,这样的情况适用于被控任务对及时要求不高的情况下,如果要求及时性的情况下解决办法有:
aa、控制任务发出信号后立即调用系统延时函数把自己挂起来,那么被控任务就有机会执行。

I、两个任务之间的双向通信,让生产者受到消费者的制约,达到产销平衡的目的,是一种不错的办法。

J、两个以上任务同步一个任务选择事件。

在最新版的FreeRTOS中新增了任务通知,保证消息生产时间慢于消息消费时间的前提下可以替代信号量、消息邮箱、事件(官方说提速45%).

1、任务通知代替事件的注意事项:任务通知不能组合判断,当一个条件满足时任务立马解除阻塞,想要组合判断就得增加逻辑。(实际写的时候按实际情况选择,任务通知code小,耗时短)。
2、任务通知代替信号量注意事项:任务通知每次只能有一个任务接收通知消息,而且需要指定具体哪个任务接收,而信号量每次可以多个任务接收(这种情况一般也很少)。

最后

以上就是有魅力凉面为你收集整理的RTOS行为同步的全部内容,希望文章能够帮你解决RTOS行为同步所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部