实时操作系统µC/OS-II在ARM7上的移植
义OS_TASK_SW宏
OS_TASK_SW宏是µC/OS-II从低优先级任务切换到高优先级任务时的调度,可以采用下面两种方式定义:一种是如果处理器支持软中断,那么可以使用软中断将中断向量指向OSCtxSw函数;另一种是直接调用OSCtxSw函数。本文用的是后一种方式。
4.2 OS_CPU_A.ASM文件分析
(1) OSStartHighRdy()函数
OSStart()函数调用OSStartHighRdy(),使就绪态任务中优先级最高的任务开始执行。
其示意性代码如下:
Void OSStartHighRdy (void)
{
调用用户定义的OSTaskSwHook();
OSRunning=TRUE;
得到将要恢复运行任务堆栈指针;
SP=OSTCBHighRdy->OSTCBStkPtr;
从新任务堆栈中恢复处理器的所有寄存器;
执行中断返回指令;
}
(2) OSCtxSw函数
该函数由OS_TASK_SW宏调用。OS_TASK_SW宏由OSSched函数调用。OSSched函数负责任务之间的切换。OSCtxSw函数在OSSched函数中负责将当前任务对应的处理器寄存器保存到堆栈中,并将任务中需要恢复的处理器寄存器从堆栈中恢复出来。(3)OSIntCtxSw()函数
该函数由OSIntExit函数调用。OSIntExit函数由OSTickISR函数调用。OSIntCtxSW负责在定时中断任务之间的切换。目前提到的函数OSCtxSW和函数OSIntCtxSW均负责任务之间的切换,区别主要在于是否在定时中断期间负责任务切换。OSIntCtxSW函数主要当前任务堆栈指针,并将新任务对应的处理器寄存器从堆栈中恢复出来。
(4)OSTickISR()函数
时间节拍函数,由定时中断产生。主要负责在进入时保存处理器寄存器,完成任务时切换,推出时恢复寄存器并返回。OSTickISR()函数完成的操作和OSCtxSw()类似,只不过OSTickISR()是由硬件定时器溢出中断触发。其示意性代码如下:
Void OSTickISR (void)
{
保存处理器寄存器;
调用OSIntEnter()或者直接给OSIntNesting加1;
if(OSIntNesting==1){
OSTCBCur->OSTCBStkPtr=SP;
给产生中断的设备清中断;}
OSTimeTick();OSIntExit();
恢复处理器寄存器;执行中断返回;
}
4.3 OS_CPU_C.C 文件分析
这个源文件中有6个函数需要移植,即OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、 OATaskSwHook()、OSTaskStatHook()和OSTASKTickHook()。后面5个函数又称为钩子函数,主要用来扩展µC/OS-II功能。但必须声明,并不一定要包含任何代码。唯一必须移植的函数是OSTaskStkInit()。该函数在任务创建时被调用,它负责初始化任务的堆栈结构。这个函数在大部分ARM处理器中移植时都可以采用一种形式。
5 测试移植代码
在EmbestIDE编译器上编译基于S3C44B0X的µC/OS-II操作系统代码。编译结果表明,裁剪后的µC/OS-II操作系统的代码占用的空间少,代码通过了编译。为了验证基于S3C44B0X的µC/OS-II操作系统移植的是否成功,本文创建了两个测试任务来验证其合理性。
创建的2个测试任务及源码如下:
OSTaskCreate (TestTransplantA, (void *) 0, TestTransplantAStk[StackSize-1], 2);
OSTaskCreate (TestTransplantB, (void *) 0, TestTransplantBStk[StackSize-1], 3);
void TestTransplantA (void *pdata)
{ pdata=pdata;
while(1) {
uart_printf(TaskA );
OSTimeDly (400);
}
}
Void TestTransplantB (void *pdata) {
pdata=pdata;
while(1) {
uart_printf(TaskB );
OSTimeDly(200);
}
}
多任务调度开始后,通过超级终端接收的UART0的数据为:taskA taskB taskB taskA taskB taskB taskA taskB taskB taskA taskB taskB taskA taskB taskB taskA taskB taskB ……。高优先级的任务TestTransplantA()首先被调度运行,说明OSTaskStkInit()和OSStartHighRdy()函数是正确的。任务TestTransplantA()和任务TestTransplantB()由时钟节拍驱动而周期地被调用,说明OSCtxSw、 OSIntCtxSw()、OSTickISR()也是正确的。通过以上两点可以认为移植结果是正确的。
6 结束语
在µC/OS-II平台下开发程序,首先要掌握内核。通过上述移植过程,能够对任务堆栈,任务调度有深刻理解。作为一种开放源代码的操作系统,以其优越的性能在嵌入式系统应用领域占据了非常广泛的发展空间。移植结果表明,经过裁剪的µC/OS-II在S3C44B0X上的移植是成功的。
参考文献
[1] S3C44BOX MICROPROCESSOR Datasheet.Samsung Electronics,2001.
[2] 田 泽. 嵌入式系统开发与应用教程[M]. 北京:北京航空航天大学出版社,2005.
[3] 任 哲. 嵌入式实时操作系统µC/OS-II原理及应用[M]. 北京:北京航空航天大学出版社, 2005.
[4] 张春雷 王东兴. µC/OS-II在C8051F020单片机上的移植[J]. 微计算机信息, 2006, (22): 95-97.
[5] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社, 1999, 106-141.
ARM7 移植 C OS-II µ 操作系统 实时 相关文章:
- 实时操作系统μC/OS-II在ARM7上的移植(05-12)
- ARM7与FPGA在工业控制中的结合应用 (06-26)
- ARM7与FPGA在工业控制的结合 (07-03)
- 基于ARM7和DSP的逆变电源设计电路(01-08)
- ARM7嵌入式系统在车辆调度中的应用范畴(07-06)
- ARM系列微处理器简介之:初识ARM系列处理器(08-13)