利用实时内核开发嵌入式多任务程序
实时内核通过任务控制块(TCB)管理任务。TCB数据结构中包括任务的状态、优先、指向任务栈顶的指针、以及其他与内核有关的信息。程序调用内核服务(如调用内核函数OSTaskCreate)创建任务,为此任务在内存中分配一个TCB、进行初始化,使任务从休眠状态转变到就绪状态。任务可以在多任务执行之前静态创建,也可
以在多任务执行过程动态创建。
内核为实时多任务应用程序提供任务调度和转换、任务间通信、定时顺等服务,并作为系统调用提供给任务使用。实时内核以事件为基础、根据任务执行状态对任务进行切换,任务的状态也随之相应改变。在实时多任务程序中,内存中存在多个任务控制块以及各个任务独立的私有堆栈。进行任务切换首先要保存CPU寄存器内容到当前任务堆栈,将堆栈指针保存到当前任务的TCB中,然后从新任务的TCB中装载堆栈指针,并将新任务上下文装载到CPU寄存器中。这样就从一个任务转换到另一个任务运行。任务使用这时内核提供的定时器系统调用,可以保持休眠状态一段时间,或者等待一段时间后成为就绪状态。在实时嵌入式系统中,外部中断事件产生的任务具有高优先级,因而以抢占方式获得CPU控制权。
三、任务构造
1.I/O任务构造
根据3种不同的I/O事件;中断驱动事件、轮询事件、输出事件来构造I/O任务。轮询事件通常由1个任务实现,实时内核以固定周期对此任务进行调度,输出事件常被设计为可重入程序而不是任务;中断驱动事件是一类典型的异步事件。
下面将以1个简单的串行设备驱动程序来说明I/O分解,突出I/O任务构造的重要特征。此设备分配得到1个中断向量,在3种情况下产生中断:接收到字符、输出就绪、设备出错。因为采用抢占式内核,在I/O中断发生进入中断处理例程以后,程序要保存处理器状态,并根据不同的中断原因进行任务调度;在中断处理完成退出中断处理例程之前,还要恢复处理器状态。
设备中断处理:
IF 接收到字符THEN
将字符放入字符接收队列;
执行接收任务;
IF 输出就绪 THEN
IF 继续输出 THEN
送下一个字符;
ELSE
保存"设备输出就绪"情况;
IF 设备出错 THEN
将错误状态放入错误队列;
执行出错处理任务;
接收任务:
Void Task_receive()
{
While (true){
Wait on input char queue;
If end of input string then
Process input string;
Else
Save input;
}
}
对于中断事件要合理划分事件的处理级别,尽可能多地在任务级处理,从而最小化系统中断延迟。对这个串行设备驱动中断的处理就是一个划分事件到中断级和任务级处理的例子。中断服务例程及时响应实时中断,将实时要
《利用实时内核开发嵌入式多任务程序(第2页)》