首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式实时操作系统PetOS设计与实现 02

嵌入式实时操作系统PetOS设计与实现 02

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次。在一级二级任务都很少被执行,而三级队列中的任务消息粒度很小且执行频率很高时,任务调度所占用的系统消耗便会急剧上升。
       一种解决方法是:PetOS给每个消息队列加入了32Bit消息标记位。其中的每一位对应一个该优先级中的任务。若消息标记变量的某一位为1,则代表该位对应的task存在尚未响应的事件;若为0,则表示该级队列所有任务的事件都已经处理完毕,可以调度次优先级的任务。
       通过消息标记位策略,若一级二级任务都不存在需要被调度的任务,则三级任务被调度一次的代价只是查询一级、二级任务的消息标记位各一次,从而大大降低了系统的消耗。
       3.2中断管理/定时函数管理
       中断管理:
       由于PetOS的实时性受到事件粒度大小的影响,系统需要提供一种更强有力的实时性保障:中断。PetOS中断处理模块主要完成中断源的判断、中断向量的维护以及中断响应函数的调度等工作。
       PetOS支持64个中断源[3],并对每个中断源支持不限数目的中断处理函数,因此该列表是一个双向链表,里面包涵了该中断号下的中断处理函数,定位后依次执行该链表中的函数。
       采用链表方式维护中断处理函数可以更加灵活的维护中断函数列表,但是实际上,很多中断函数都是一次性的,比如USB连接响应函数在被调用后,需要将自己从该中断的函数列表内删除。而此时,中断处理函数正在使用该列表,这样就引起了中断函数链表的不一致性。
       解决的方式是:
       1)给所有函数句柄加入状态。
       2)维护中断函数列表时,如果句柄处于闲置状态,则进行默认的操作;如果句柄处于IRQ状态被删除,则暂时不进行直接的删除操作,而是将句柄状态改成PETOS_IRQ_HANDLER_CALL_STATUS_DELETE。
       3)当中断处理主函数调用完该函数后,若发现该函数的句柄状态已经改变,则可得知该函数已经在调用过程中将自己注销。IrqHandler会在此时重写中断维护模块API中注销函数,在这里将该函数句柄删除。
返回列表