保存桌面快捷方式 - - 设为首页 - 手机版
凹丫丫旗下网站:四字成语大全 - 故事大全 - 范文大全
您现在的位置: 范文大全 >> 理工论文 >> 电子通信论文 >> 正文

微型抢占式多任务实时内核设计


??优先等级=动态优先等级×16 + 静态优先等级。

??优先等级值越大,优先级越低。可以看出,动态优先级起决定作用。

??怎样实现优先级动态可调呢?首先简要介绍MacroStar中任务的四个状态:

??休眠(dormant)——任务因调用睡眠函数、挂起函数或者等待内核同步对象而进入休眠态;

??等待(waiting)——任务因等待消息或者信号(勿与“信标”、“信号量”相混淆)而进入等待态;

??就绪(ready)——任务运行的条件都已俱备,只等被调度,称为就绪态,亦称可调度态;

??运行(running)——任务正在使用处理器的资源,称为运行态。

??这些状态都是用标志位来实现的。16个静态优先级对应的任务的某一状态刚好可用一个16位的二进制数来标识。休眠态用os_slpState来表示,从高位算起,第N位为0表示静态优先级为N的任务处于休眠态。等待态是依据“事件驱动”观念而专为消息和信号而设计的,用os_rdyhState和os_rdyState两个16位的变量来记录。只有当os_rdyhState和os_rdyState的第N位均为0时,才表示静态优先级为N的任务处于等待态。如果任务处于非等待状态,意味着任务已在处理事件或者有事件要处理(可以认为任务一开始就处理“启动”这个“虚拟事件”),这时,才有动态优先级的概念。如果os_rdyhState中的第N位为1,表示静态优先级为N的任务的动态优先级为紧急级;如果os_rdyhState第N位为0,则表示静态优先级为N的任务的动态优先级为普通级。要求实时处理的事件发生后,内核简单将os_rdyhState相应位置1,提升任务的动态优先级;当前事件处理完毕后,如果已无实时性要求较高的事件等待处理,简单地将os_rdyhState相应位清0,降低任务的动态优先级。由此,即可实现优先级的动态可调。只有当任务既不处在休眠态也不处在等待态时,任务才是可以调度的。

2 任务管理

    2.1 任务控制块

??多任务系统中用任务控制块(TCB)来记录任务的各种属性。在这些属性中,最重要的是任务堆栈栈顶地址。进行上下文切换(context switch)时,被停止执行的任务的所有寄存器状态、下一条代码的地址都要入栈保护,因而这个属性是必需的。如果允许修改任务的优先级,优先级属性也是必需的。所以,将任务控制块简化如下:

typedef struct{

uint_16 msg[2]; /*消息接收区*/

int * sp; /*堆栈栈顶指针*/

uchar priority; /*静态优先级*/

uchar reserved; /*保留 */

}TCB,*PTCB;

TCB os_tcbs[ USER_TASK_NUM +1 ];

/*用户任务数最多为15个*/

??msg用来存储发送给任务的消息,两个16位的二进制可按位存放32个消息。sp指向任务堆栈栈顶。priority记录任务的静态优先级。数组os_tcbs用来记录系统所有任务的信息,其下标与任务的ID号相对应,即ID号为N的任务的控制块为os_tcbs[N]。

2.2 任务的创建

os_CreateTask函数用来创建一个任务:

void os_CreateTask(

TASKPROC task, //任务函数的指针

uchar taskId, //任务的ID号

uchar priority, //优先

《微型抢占式多任务实时内核设计(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/140468.html

★温馨提示:你可以返回到 电子通信论文 也可以利用本站页顶的站内搜索功能查找你想要的文章。