原创 基于51单片机的实时操作系统的研究(六)

2010-6-15 11:10 2056 8 8 分类: MCU/ 嵌入式

基于51单片机的实时操作系统的研究(六)


51操作系统 2009-04-17 14:41:32 阅读159 评论1 字号:



4 、中断服务程序


任务选择和任务优先级别


 Small RTOS 51调度程序是将“任务就绪表”中的最高优先级别的任务作为下个要执行的任务,换句话说,任务运行要符合两个条件,一是其状态是“就绪态”的,二是在所有就绪态任务中,该任务的优先级别是最高的(数值最小)。


系统中可能存在多个就绪的任务,即就绪表中有多个比特被置位,Small RTOS 51通过一个简单的查表算法,可以快速得到其中的最高优先级任务,


    Small RTOS 51最大允许16个任务,任务就绪表共16位,每个任务占用1位。


就绪表结构:定义代码如下


#if OS_MAX_TASKS < 9


uint8 OSTaskRuning = 0xff;                  


 #else


uint16 OSTaskRuning = 0xffff;


#endif


当任务的数小于9(OS-MAX-TASKS<9)时,就绪表为uint8型变量,当任务数为9到16之间时,就绪表为uint16型。就绪表每一位代表一个任务,当这一位为0时,表示任务处于等待或挂起状态;当这一位为1时,表示任务处于就绪或运行或中断状态。


任务切换过程   Small RTOS 51按任务优先级别的切换,提供了两种任务切换方式,主动切换和被动切换,前者是应用任务通过调用系统函数自动将自己挂起,后者是操作系统根据当前任务运行情况,将正在运行的任务强制挂起,从而切换到另一个任务执行。被动切换对于任务来说是不可预知的,因此可能发生在任意代码位置。


Small RTOS 51的任务优先级别一般采用常量定义,实际上属于静态优先级别,即在任务运行开始前已定义好了,在运行过程中,系统不改变任务的优先级别。


任务栈的定义与赋初值  Small RTOS 51是采用独立任务栈的切换方法,给每个任务分配一个任务栈数组,文件中定义的“OSTaskStackBotton[ ]”变量, 在切换时将处理器的堆栈指针SP指向该数组,从而实现任务切换。任务栈数组(“OSTaskStackBotton[ ]”)在系统初始化时被赋予每个任务的堆栈的顶端和底端位置。


Uint8 idata *OSTaskBotton[OS-MAX-TASK+2];


首次执行的任务 Small RTOS 51执行函数init ( )来给寄存器赋初值和OSStart ( ) 来初始化每一个任务的堆栈并执行第一个任务,而第一个任务底选择依据是任务的优先级


别,选择过程中完成任务的调度。

图2.2  任务的首次启动执行过程


在一般的函数调用中,子函数执行完成后,继续返回主调函数执行,而调度函数通过改变堆栈内容来变更原来的程序执行路线,图中函数执行“RETI”指令后,并不返回“OSStart (  )”,而是执行了一个任务函数。


下次执行的任务     一个任务在运行时,在遇到外部资源和条件未准备好时,可以调用内核切换函数,挂起本任务,暂时切换到另外一个任务运行,还有一种切换是在硬件中断中进行的,当前任务被动地被中止Small RTOS 51支持这两种切换。


存储器管理:内核使用了KEIL C51编译器的对全局变量和局部变量采取静态分配存储空间策略,因此存储器管理简化为堆栈管理。内核为每个任务都保留一个单独的堆栈区,全部堆栈管理都在IDATA空间进行。为了给当前正在运行的任务分配尽可能大的栈区,所以各个任务所用的堆栈位置是动态的,并用OSTASKSTACKBOTTON[TASKID]来记录和任务堆栈栈底位置。系统总是把空闲的空间留给正在运行的任务,即在任务调度时要进行自由RAM的移动。 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条