![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
·STOP:任务停止状态。不接受消息,不可执行。无数据
图2 PetOS 任务状态转换图
·RUN:任务运行状态。能接受消息,可以执行 ·PAUSE:任务挂起状态:不能接受消息,不可执行。但保持数据。
任务在PetOS启动时被注册,并常驻在操作系统中。即操作系统初始化完毕并启动之后,操作系统调度的任务列表是固定的。操作系统启动后,任务只会在运行、暂停、挂起状态之前切换。
任务状态图如图2:
为了方便任务的管理与控制,每个TASK都会绑定TCB(task control block)。TCB类似于现代操作系统中进程的PCB,它记录了task的各种状态变量、控制变量以及标准接口的函数指针,便于PetOS和应用程序维护。
Event(事件消息):
Event是PetOS进程调度的粒度单位。
由于PetOS的每个任务不具备独立的代码/数据段/堆栈指针,我们无法在任意的位置暂停一个task而启动另一个。PetOS的解决策略是:将task拆分成为一个个独立的由事件驱动的逻辑模块,每个task都有各自独立的事件队列。Task的每个逻辑功能都会被映射成一个事件,操作系统通过赋予某个task响应事件的权利来完成一次调度。而操作系统的多任务调度可以Task轮流响应事件来实现。
任务的调度:
图3调度算法流程图
在嵌入式系统中,很多应用要求执行的优先级绝对优先,比如USB文件传输的处理。为此,PetOS采用了多级任务机制,并赋予高优先级的任务更高的执行权限。调度时,PetOs将优先调度优先级高的任务。这种调度方式保证了高优先级任务的实时响应,但可能导致低优先级的任务永远无法被执行。为了缓解这种‘饿死’现象,PetOS提供了两种可选的配置:
·严格优先级调度模式:即,若高优先级的任务队列中存在还有事件未响应的任务,则无条件执行高优先级的任务。
·非严格优先级调度模式:即,当高优先级队列调度一轮过后,次优先级的任务队列中的第一个待执行任务可以得到1次调度。调度完成后继续轮询高优先级队列。
可以看到两者的区别在于:严格调度模式可以保证高优先级任务的绝对优先,但是低级任务可能出现‘饿死’的情况。而对于非严格调度模式,不论任务优先级有多低,总能以较低的频率执行。
调度算法的分析及优化:
在非严格模式下,设一级、二级、三级task队列的长度分别为N1,N2,N3。则二级队列中调度一个任务需要判断一级任务N1次;三级队列中调度一个任务需要在一级队列中判断N1×N2次,在二级队列中判断N2次。在一级二级任务都很少被执行,而三级队列中的任务消息粒度很小且执行频率很高时,任务调度所占用的系统消耗便会急剧上升。 |
|