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的移动。
文章评论(0条评论)
登录后参与讨论