打印
[应用相关]

基于RTOS的软件开发理论

[复制链接]
楼主: 黑心单片机
手机看帖
扫描二维码
随时随地手机跟帖
21
黑心单片机|  楼主 | 2022-5-1 13:54 | 只看该作者 回帖奖励 |倒序浏览
3、 公共函数的设计

基于RTOS系统的全局公共函数,需要考虑多任务访问的冲突。好比你在家如厕,使用私有资源随心所欲;出门在外上公厕,使用共享资源就得遵守一定规则。如果某个任务调用某个公共函数时,被另一个髙优先级的任务抢占,且高优先级任务也要调用该公共函数,为防止破坏原任务的数据,确保这段代码即使在多个任务同时且多次调用,运行结果表现都是一样,就必须按一定规则限制访问,一般采用两种措施,互斥调用和可重入设计。


使用特权

评论回复
22
黑心单片机|  楼主 | 2022-5-1 13:54 | 只看该作者
3.1 互斥调用

将公共函数作为一种共享资源看待,以互斥方式调用公共函数。如果公共函数比较简单,运行时间很短,则可采用先关中断( 或关调度) 再调用公共函数,调用结束后再开中断(或开调度),从而避免其他任务打扰。如果公共函数比较复杂,运行时间较长,以上方案严重影响系统的实时性,最好为这个公共函数配备一个互斥信号量,任何任务在调用这个公共函数前必须首先取得对应的互斥信号量,否则就会被挂起。


使用特权

评论回复
23
黑心单片机|  楼主 | 2022-5-1 13:55 | 只看该作者
3.2 可重入设计

可重入函数允许多个任务嵌套调用,各任务的数据相互独立,互不干扰,这种方式比采用互斥调用更直接。

将公共函数设计成为可重入函数的关键是不使用全局资源(如全局变量),只能使用临时的局部变量,局部变量是调用时临时分配储存空间,所以不同的任务在不同时刻调用该函数时,同一个局部变量分配的存储空间是不重叠的,互不干扰。可重入函数调用的其他函数也必须是可重入的。


使用特权

评论回复
24
黑心单片机|  楼主 | 2022-5-1 13:57 | 只看该作者
3.3 运行效率

为保证运行效率和实时性要求,函数尽量不要使用轮询等待机制,可使用任务休眠等待。


使用特权

评论回复
25
黑心单片机|  楼主 | 2022-5-1 13:57 | 只看该作者
4 、中断服务程序的设计

中断服务程序(ISR ) 是嵌入式应用系统获取各种事件的基本手段,ISR的设计质量直接影响到系统的实时性指标和工作效率。


使用特权

评论回复
26
黑心单片机|  楼主 | 2022-5-1 13:58 | 只看该作者
4.1 中断优先级

为不同的中断服务程序安排不同的优先级,在允许中断嵌套的情况下,高优先级的中断总是能够得到及时响应。只要没有关闭中断,中断服务程序可以中断任何任务的运行,故可以将中断服务程序看成比最高优先级任务还要优先的特殊任务(视RTOS类型和配置而定)。


使用特权

评论回复
27
黑心单片机|  楼主 | 2022-5-1 13:59 | 只看该作者
4.2 中断优先级原则

中断源是系统及时获取异步事件的主要手段,其优先级规则和任务比较类似,原则如下:

紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。

关键性:触发中断的事件越关键( 重要〉,设定的中断优先级就越高。

频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。

快捷性:在前三项条件相近时,ISR 处理越快捷( 耗时短),设定的中断优先级就越高。


使用特权

评论回复
28
黑心单片机|  楼主 | 2022-5-1 14:00 | 只看该作者
4.3 中断与关联任务的通信

中断的主要功能是响应异步事件,ISR只是触发事件,本身不做过多处理,将获取的异步事件通信给关联任务处理。

ISR 与关联任务的通信方式有两种方式,信号量和消息:当使用信号量进行通信时,ISR 只发送信号量,表示事件发生,通过信号量的同步功能触发关联任务,所有具体工作均由关联任务完成。当使用数据消息进行通信时,ISR 需要完成对异步事件的信息采集,然后使用消息邮箱(或消息队列) 将数据发送给关联任务,由关联任务完成后续数据处理工作。


使用特权

评论回复
29
黑心单片机|  楼主 | 2022-5-1 14:00 | 只看该作者

哪种方式更合适,需根据实际情况而定:

触发 ISR 的亊件不包含数据:不需要对事件进行数据处理,仅仅是一个特殊标记,这种情况 ISR 使用信号量与关联任务进行通信。

触发 ISR 的事件是包含数据的低频事件:将数据采集的工作放在关联任务中完成,产生的时刻延误与采样周期相比可以忽略不计,这种情况下,ISR 使用信号量与关联任务进行通信,从而简化了ISR。

触发 ISR 的事件是包含数据的中髙频事件:数据采集的工作放在关联任务中完成,可能因为时刻延误对采样数据的质量有影响,在这种情况下,数据采集的工作应该放在 ISR 中完成,再使用消息邮箱(或消息队列)与关联任务进行通信,关联任务从消息邮箱(或消息队列)中得到消息的数据,并完成后续处理。

触发 ISR 的事件是包含数据的非周期“高频”事件:对于非周期“高频”事件,其最短事件间隔可能小于事件数据处理的耗时,如果在关联任务采集数据就可能出现数据丢失问题,在这种情况下,数据采集的工作应该放在 ISR 中完成,由 ISR 使用具有数据缓冲功能的消息队列与关联任务进行通信,关联任务从消息队列中得到消息的数据,并完成后续处理工作。

有些芯片平台的中断服务不能使用操作系统接口函数,不能直接发送消息或者信号量,需要进行特殊处理。更多细节可关注微信公众号 嵌入式系统 ,获取更多技能。


使用特权

评论回复
30
黑心单片机|  楼主 | 2022-5-1 14:01 | 只看该作者
5、 行为同步

在实时操作系统的支持下,系统的整体功能是通过各个任务( 包括 ISR )的协同运行来实现的,其中运行步骤的协调就是行为同步。


使用特权

评论回复
31
黑心单片机|  楼主 | 2022-5-1 14:02 | 只看该作者
5.1 行为同步的通信方式

一个任务的运行过程需要和其他任务的运行配合,才能得到预定的效果,任务之间的协调关系称为“行为同步”。行为同步的结果体现为任务之间的运行按某种预定的顺序来进行。一般实时操作系统提供了各种的通信方式来适应不同场合的需求,实现任务之间的行为同步。这里只是简要描述,不同RTOS只是接口不同,其作用都一样。


使用特权

评论回复
32
黑心单片机|  楼主 | 2022-5-1 14:03 | 只看该作者
5.1 1 二值信号置

可以简单理解为一个全局变量只能为0或者1,但其实是基于系统接口实现,支持跨任务读写。二值信号量初始值为0,控制方发出同步信号(put/give),二值信号量的值为 1,被控制方在任务的同步点调用“等待一个信号量”的服务函数(get/take),如果二值信号量的值已经为 1,就将二值信号量复位( 清零) 并继续运行下去;如果二值信号量的值为 0,便使自己挂起等待控制方的信号。

如果被控制方总能够及时响应控制方发出的信号,完成相应处理任务,并在下一次信号来到之前进入等待状态,这样才能保证稳定。如果被控制方获取信号量过慢,控制方可能已经发出多个信号,导致信号事件被丢失。

把同步信息视为一个产品,控制方是产品的生产者,被控制方就是产品的消费者。当产品的“最短生产时间”比产品的“最长消费时间”还长时,产品永远是“供不应求 ”,消费者总是处于等待状态”,生产出来的产品立即被消费者取走,生产者和消费者达到完全同步,生产一个就立即消费一个。如果生产过快,消费来不及,出现产品积压,则表示任务可能需要调整优先级,或者说二值信号量不合适,需要使用计数信号量。


使用特权

评论回复
33
黑心单片机|  楼主 | 2022-5-1 14:04 | 只看该作者
5.1.2 计数信号量

只要产品的平均生产时间比产品的平均消费时间长,所有的产品就都会被消费掉。但仍然有可能在某个时间段内出现临时的“产品积压”。如产品的生产时间为 20-40 秒(平均30秒),产品的消费时间为 10-30秒(平均 20 秒),总体上看是生产慢、消费快,但在某个时间段,生产速度维持在高水平状态(每20秒生产一个),而消费速度偏偏维持在低水平状态(每30秒消费一个),这时就会临时出现产品积压现象。

二值信号量不能处理“信号积压”现象,未及时响应的信号将会被遗弃,有效响应次数少于实际发出的信号次数。在这种情况下,采用计数信号是一个有效的选择,在总体上能够使控制方对被控制方进行同步控制,在特殊情况下也不失去控制,保证每次控制信号都能够得到响应,尽管响应时间偶尔会有延误。

计数信号最初始值为 0,控制方需要发出同步信号时,就调用“发出一个信号量”的服务函数,使计数信号量的值加 1,被控制方在任务的“同步点”调用“等待一个信号量”的服务函数。如果计数信号量的值不为 0,就将计数信号量减 1,并继续运行下去;如果计数信号量的值为0,便使自己挂起,等待控制方的信号。

计数信号量适用于被控制方不能保证在下一次信号到来之前处理完本次控制方发出的信号,但总体上可以响应所有信号。


使用特权

评论回复
34
黑心单片机|  楼主 | 2022-5-1 14:05 | 只看该作者
5.1.3 事件标志组

需要将两个以上的信号进行某种逻辑运算,且用逻辑运算结果作为同步控制信号时,简单的通信方式难以实现,可采用“事件标志组”来实现,事件标志组是若干二值信号的组合,可以实现多个任务(包括 ISR)协同控制一个任务,当各个相关任务(包括ISR)先后发出自己的信号后,使事件标志组的对应标志有效,预定的逻辑运算结果有效,触发被控制的任务。

事件标志组的使用方法很灵活,可以将标志定义为“1 有效”,也可以将标志定义为“0 有效”,逻辑关系可以为“逻辑与”(全部标志均有效),也可以为“逻辑或”( 只要任何一个标志有效)。可以简单理解为某个变量,多个控制任务共同控制变量的对应的位,被控制任务在全部或者某一位满足要求时触发运行。


使用特权

评论回复
35
黑心单片机|  楼主 | 2022-5-1 14:06 | 只看该作者
5.1.4 消息邮箱

用信号量进行行为同步时,只能提供同步的时刻信息,不能提供内容信息,当控制方对被控制方进行控制,需要向被控制方提供内容信息时,消息邮箱是一种有效的方案。

关于邮箱,不同的RTOS其功能定义有一定差异。大多数RTOS的邮箱不支持缓存,后面发送的会覆盖前面;但有的类似简化版的消息队列,支持缓存,只是消息内容固定为一个指针,可以多次发送;有的RTOS不支持邮箱。


使用特权

评论回复
36
黑心单片机|  楼主 | 2022-5-1 14:06 | 只看该作者
5.1.5 消息队列

消息队列是应用比较多,队列可以存放多个消息,能够有效解决消息的临时堆积问題,但仍然需要满足一个条件,消息的平均生产时间比消息的平均消费时间长,否则,再长的消息队列也会溢出。

特别注意,当需要传输的数据量较大时,传输其内容指针,而不是内容本身。


使用特权

评论回复
37
黑心单片机|  楼主 | 2022-5-1 14:07 | 只看该作者
5.1.6 通信方式的选择

以上用于行为同步的通信方式,根据实际情况来选择:

当同步过程不需要传输具体内容时,可选择二值信号量、计数信号量和事件标志组。

当同步过程需要传输具体内容时,可选择消息邮箱、消息队列。

当“任何时候同步信息的生产速度都比同步信息的消费速度慢”时,可选择二值信号量 、事件标志组。

对于非周期性同步信息,当不能保证“任何时候同步信息的生产速度都比同步信息的消费速度慢"时,可选择有缓冲功能的计数信号量、消息队列。

当同步信号为多个信号的逻辑运算结果时,采用事件标志组作为同步手段


使用特权

评论回复
38
黑心单片机|  楼主 | 2022-5-1 14:08 | 只看该作者
5.2 行为同步

合理安排同步点和任务的优先级是获得预期同步效果的关键。


使用特权

评论回复
39
黑心单片机|  楼主 | 2022-5-1 14:09 | 只看该作者
5.2.1 ISR 与任务之间的同步

一个任务(或 ISR)为控制方,发出控制信息,另一个任务为被控制方,获取控制信息后即进入就绪状态,若优先级足够高就可以很快进入运行状态,必要时可在ISR退出前进行一次任务切换。

一个由异步亊件触发的ISR 通常与一个任务关联,它们之间就是单向同步关系,与ISR关联的任务总是处于等待状态,每当ISR发出信息就被触发,其任务结构为事件触发型。


使用特权

评论回复
40
黑心单片机|  楼主 | 2022-5-1 14:09 | 只看该作者
5.2.2 两个任务之间的单向同步

如果单向同步发生在两个任务之间,同步效果与两个任务的优先级有关。当控制方任务的优先级低于被控制方任务的优先级时,控制方任务发出信息,被控制方任务进入就绪状态,并立即发生任务切换进人运行状态,瞬时同步效果较好。当控制方任务的优先级高于被控制方任务的优先级时,控制方任务发出信息后,虽然被控制方任务进入就绪状态,但并不发生任务切换,只有当控制方调用系统服务休眠或其它使自己挂起时,被控制方任务才有运行机会,瞬时同步效果较差。不过,控制方在发出信息后立即调用延时函数( 延时时间大于被控制方任务的处理时间),主动使自己挂起来,让低优先级的被控制方任务尽快得到运行机会,可改善同步效果。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则