μC/OS-II 嵌入式实时操作系统在S12 单片机上的移植过
执行中断返回指令RTI 以开始运行这个任务。以下是详细代码:
void OSStartHighRdy(void)
{
OSTaskSwHook(); //调用钩子函数
asm{
ldx OSTCBCur // 加载OSTCBCur 的地址到 x
lds 0,x //把OSTCBStrPtr 载入堆栈指针 sp
ldaa OSRunning
inca // SRunning = TRUE
staa OSRunning
rti
}
}
3.2.4 任务级任务切换函数OSCtxSw()和中断级任务切换函数OSINTCtxSw()
任务级的切换是通过执行软中断指令来实现的。OSCtxSw()实际上就是软中断服务子程序,软中断服务子程序的向量地址指向OSCtxSw()。如果当前任务调用μC/OS-II
提供的功能函数,并使更高优先级任务进入了就绪状态,则μC/OS-II 就会借助上面提到的向量地址找到OSCtxSw()。在系统服务调用的最后,μC/OS-II 会调用任务调度函
数OSSched(),并由此推断出当前任务不再是需要运行的最重要的任务。
OSIntCtxSw()函数中的绝大多数代码同OS_TASK_SW()函数是一样的。而中断退出函数则是通过函数OSIntCtxSw()来从ISR 中执行切换功能,区别只是因为ISR 已经保存了
CPU 的寄存器,而不再需要在OSIntCtxSw()函数中保存CPU 的寄存器。以下只给出任务级任务切换函数OSCtxSw()的代码:
void OSCtxSw(void)
{
asm{
ldx OSTCBCur // 加载当前任务的堆栈指针
sts 0,x // 保存到当前任务的TCB 中
}
OSTaskSwHook(); //调用钩子函数
STCBCur = OSTCBHighRdy; // 改变任务的 OSTCBCur 和OSPrioCur
SPrioCur = OSPrioHighRdy;
asm{
ldx OSTCBCur // 得到新任务的堆栈指针
lds 0,x // 加载新任务的堆栈指针到 sp
rti
}
}
4 移植代码的测试
为了验证移植结果是否正确,对移植后μC/OS-II 代码进行了测试,这是移植中很重要的一个环节。首先对内核自身的运行情况进行了测试,待内核自身的运行正常工作
后,又创建三个任务:任务1 通过PORTA 口点亮LED 灯,该任务每秒运行一次;任务2和任务3 都通过串输出字符串,这两个任务都是每2 秒运行一次,并通过信号量来实现
互斥,以使得每个任务每次运行时均可完成所有字符的输出。实验测试证明在μC/OS-II管理与调度下,使得这三个任务都能正确、可靠地相继运行。
5 小结
通过μC/OS-II在MC9S12DG128上的移植,加深了对μC/OS-II内核工作原理和任务调度实现方法的理解,掌握了μC/OS-II移植的一般方法,测试结果表明移植代码可以稳定可靠的运行,实现了多任务的管理和调度。μC/OS-II实时操作系统的引入,不但可以提高系统的实时性、可靠性和稳定性,还提高了应用软件的可移植性,降低了开发人员的工作量。
评论