从 μC/OS 升级到 μC/OS-II
μC/OS-II和μC/OS一样,分别定义两个宏来开中断和关中断:OS_ENTER_CRITICAL()和
OS_EXIT_CRITICAL()。在μC/OS向μC/OS-II升级的时候,用户不必动这两个宏。.
10.2.3OS_STK_GROWTH
大多数微处理器和微处理器的栈都是由存储器高地址向低地址操作的,然而有些微处理器的工
作方式正好相反。μC/OS-II设计成通过定义一个常数OS_STK_GROWTH来处理不同微处理器栈操作的取向:
对栈操作由低地址向高地址增长,设OS_STK_GROWTH 为 0
对栈操作由高地址向低地址递减,设OS_STK_GROWTH 为 1
有些新的常数定义(#define constants )在μC/OS中是没有的,故要加到OS_CPU.H中去。
10.2.4OS_TASK_SW()
OS_TASK_SW()是一个宏,从μC/OS升级到μC/OS-II时,这个宏不需要改动。当μC/OS-II从低优先级的任务向高优先级的任务切换时要用到这个宏,OS_TASK_SW()的调用总是出现在任务级代码中。
10.2.5OS_FAR
因为Intel80x86的结构特点, 在μC/OS中使用过OS_FAR 。 这个定义语句 (#define ) 在μC/OS-II中去掉了,因为这条定义使移植变得不方便。结果是对于Intel80x86,如果用户定义在大模式下编译时,所有存储器属性都将为远程(FAR).
在μC/OS-II中,任务返回值类型定义如程序清单L10.5所示。用户可以重新编辑所有OS_FAR的文件,或者在μC/OS-II中将OS_FAR定义为空,去掉OS_FAR,以实现向μC/OS-II的升级。
程序清单 L10.5 在 μC/OS 中任务函数的定义
voidOS_FARtask(void*pdata)
{
pdata=pdata;
while(1){
.
.
}
}
10.3 OS_CPU_A.ASM
移植μC/OS 和μC/OS-II 需要用户用汇编语言写4个相当简单的函数。
OSSTartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()
10.3.1OSStartHighRdy()
在μC/OS-II中,OSStartHighRdy()要调用OSSTaskSwHook()。OSTaskSwHook()这个函数在μC/OS中没有。用户将最高优先级任务的栈指针装入CPU之前要先调用OSTaskSwHook()。
还有, OSStartHighRdy要在调用OSTaskSwHook()之后立即将OSRunning设为1。程序清单L10.6 给出OSStartHighRdy()的示意代码。.μC/OS只有其中最后三步。
程序清单 L10.6 OSStartHighRdy()的示意代码
OSStartHighRdy:
CallOSTaskSwHook(); 调用OSTaskSwHook();
SetOSRunningto1; 置 OSRunning 为
1;
LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;
将 OSTCBHighRdy->OSTCBStkPtr 装入处理器的栈指
针;
POPalltheprocessorregistersfromthestack; 从栈中弹出所有寄存器的值;
ExecuteaReturnfromInterruptinstruction; 执行中断返回指令;
10.3.2OSCtxSw()
在μC/OS-II中,任务切换要增作两件事,首先,将当前任务栈指针保存到当前任务控制块TCB后要立即调用OSTaskSwHook()。其次,在装载新任务的栈指针之前必须将OSPrioCur设为OSPrioHighRdy 。OSCtxSw()的示意代码如程序清单L10.7所示。μC/OS-II加上了步骤L10.7(1)和(2)。
程序清单 L10.7 OSCtxSw()的示意代码
OSCtxSw:
PUSHprocessorregistersontothecurrenttask’sstack;
所有处理器寄存器的值推入当前任务栈;
SavethestackpointeratOSTCBCur->OSTCBStkPtr;
CallOSTaskSwHook();1)
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;(2)
LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;
将 OSTCBHighRdy->OSTCBStkPtr 装入处理器的栈指
针;
POPalltheprocessorregistersfromthestack; 从栈中弹出所有寄存器的值;
ExecuteaReturnfromInterruptinstruction;
10.3.3OSIntCtxSw()
如同上述函数一样,在μC/OS-II.中,OSCtxSw()也增加了两件事。首先,将当前任务的栈指针保存到当前任务的控制块TCB后要立即调用OSTaskSwHook()。其次,在装载新任务的栈指针之前必须将OSPrioCur 设为OSPrioHighRdy。程序清单L10.8给出OSIntCtxSw()的示意代码。μC/OS-II.中增加了L10.8(1)和(2)。
程序清单L10.8OSIntCtxSw()的示意代码
OSIntCtxSw():
AdjustthestackpointertoremovecalltoOSIntExit(),localsin
OSIntExit()
andthecalltoOSIntCtxSw();
调整由于调用上述子程序引起的栈指针值的变化;
SavethestackpointeratOSTCBCur->OSTCBStkPtr;
保存栈指针到OSTCBCur->OSTCBStkPtr;
CallOSTaskSwHook(); 调用OSTaskSwHook();(1)
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;(2)
LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;
将 OSTCBHighRdy->OSTCBStkPtr 装入处理器的栈指针;
POPalltheprocessorregistersfromthestack
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
