嵌入式实时系统的任务设计

时间:2021-02-13 16:41:53

嵌入式实时系统的任务设计主要为任务函数的设计、任务优先级的安排、任务的数据结构设计,任务之间的同步与通信设计。

一.任务函数的设计

任务函数按任务结构可分为单次执行任务、周期执行任务和事件触发任务,各任务的主要差异点如下:

单次执行任务:执行完任务后进入休眠状态(一般是从任务调度中删除自己)

周期执行任务:执行完任务后进入等待状态,等待时间为周期时间(当执行周期小于一个时钟节拍或者不是时钟节拍的整数倍时,可设计为定时器中断触发任务)

事件触发任务:等待事件触发后再执行任务

 

二.任务优先级的安排

任务优先级一般按以下顺序由高到低安排:

中断关联性

紧迫性

关键性

周期性

快捷性

传递性

 

实际优先级设计应留有余地,以至于将来做功能扩充时不必对原有优先级做大幅度调整。考虑到优先级继承情况,不应将任务的优先级安排得太紧密。

 

三.任务的数据结构设计

任务的数据结构分为与操作系统有关的数据结构和与操作系统无关的数据结构,与操作系统有关的数据结构可在操作系统配置中进行裁剪,与操作系统无关的数据结构要注意作用域(局部变量还是全局变量)

 

四.任务之间的同步与通信

在操作系统的管理下,任务间不允许相互调用,需通过同步与通信机制来进行协调,可参考多任务实时系统的同步与通信。具体可分为行为同步、资源同步和数据通信。

 

对于任务调用的公共函数,有二个处理方法:

①互斥调用:执行时间短设置开关中断,执行时间长则配置信号量

②可重入设计:不使用全局资源

 

1. 行为同步

①中断与任务间的单向同步:通过信号量或消息邮箱同步

 

②两个任务间的单向同步:通过信号量同步,当控制方优先级高于被控制方优先级时,控制方在发出信息后调用延时函数挂起自身,让低优先级的被控制任务得以尽快运行

 

③两个任务间的双向同步:设立交汇点,任务A在交汇点向B发送消息,并等待B回复;B到达交汇点后等待A发送消息,在收到消息后回复A。其执行过程如下:

若任务A优先级高于任务B,任务A先运行,到达交汇点后发送消息给任务B,等待B回复;在A等待的时候,B进入运行状态,B到达交汇点后,收到A发送的消息,B给A回复消息;高优先级任务A被激活,离开交汇点,A被挂起后,B离开交汇点。

若任务A优先级低于任务B,任务B先运行,到达交汇点后等待A发送的消息;在B等待的时候,A进入运行状态,A到达交汇点后,发送消息给任务B并等待B回复;B收到A的消息后给A回复,高优先级任务B先离开交汇点,B被挂起后,A收到回复离开交汇点。

 

④两个以上任务同步一个任务:使用事件标志组

 

⑤多个任务相互同步:用一个初始值为0的全局变量作为签到计数器,每个任务先从签到计数器的当前值判断是否是最后一个到达任务,如果是就清零签到计数器并向其他任务发出同步信号,如果不是就通过将签到计数器加1来进行签到,然后等待同步信号(挂起)

 

2. 资源同步

①  关中断

②  关调度

③  互斥信号量

④  计数信号量

 

3. 数据通信

①  全局变量:没有行为同步,数据量小的情况下

②  内存数据块:没有行为同步,数据量大的情况下

③  消息邮箱:有行为同步,通信双方执行频度相同下适用;在发送消息方为中断处理程序时,消息保存有全局变量、静态局部变量和将消息内容冒充指针发送的方法,后二种方法较优

④  消息队列:适用于以下情况:消息双方至少一方没有稳定的执行周期;通信双方执行周期不同