μC/OS-II在ARM平台的移植研究

2015-01-04 09:16豹,石
长春大学学报 2015年6期
关键词:堆栈寄存器中断

陈 豹,石 锋

(徐州工程学院 a.信电工程学院;b.教务处,江苏 徐州 221000)

μC/OS-II在ARM平台的移植研究

陈 豹a,石 锋b

(徐州工程学院 a.信电工程学院;b.教务处,江苏 徐州 221000)

在嵌入式系统中引入操作系统,可以提高嵌入式设备的稳定性和可靠性,加快系统软件的开发效率。文章完成μC/OS-II在ARM平台上的移植,给出详细的移植方案。经测试移植成功,系统可稳定运行,从而给μC/OS在其他处理器上的移植提供一些参考。

移植;μC/OS-II;ARM

0 引言

在复杂的应用场合,可以在嵌入式硬件平台上引入操作系统,μC/OS[1]是由Jean J.Labrosse先生编写的一个嵌入式实时操作系统,代码开源、免费、短小精悍、可扩展性强,最小内核可编译至2KB,从推出以来,经过长期的应用测试,其可靠性得到了验证,目前已经在很多场合得到广泛使用,严格地说μC/OS-II只是一个实时操作系统内核,仅提供了任务调度、任务管理、时间管理、内存管理和任务间的通信和同步等基本功能,文章研究其在高性能ARM[2]处理器上的移植细节,给出详细的移植方案。

1 μC/OS-II的文件结构[3]

μC/OS-II实际上是若干程序文件的集合体,主要是C程序文件,并且这些文件间存在一定的关系,操作系统的文件组成如图1所示。

图1 μC/OS-II的文件结构

2 系统环境

本次移植用的硬件是三星公司生产的ARM920T内核的S3C2410嵌入式微处理器,软件使用ARM公司的集成开发环境ADS1.2。

3 任务模式选择分析

ARM处理器具有7种工作模式,除用户模式外其他6种都属于特权模式,系统运行过程中会涉及到工作模式的转换,比如发生IRQ中断时处理器会切换到IRQ异常模式,处理器切换到不同模式时能访问的物理寄存器是有差别的,在ARM处理器上运行时,μC/OS-II移植需要实现的开关中断函数、任务切换函数都涉及到对ARM处理器中当前程序状态寄存器CPSR的操作处理,而CPSR的访问和主动修改只能在系统处于特权模式下才能实现,所以,本次移植设定操作系统代码和用户代码运行在系统模式,系统模式属于特权模式,这样在程序中可以方便的直接修改CPSR中相关位的值,比如中断允许位I、工作模式位M[4:0],以满足系统开关中断函数、任务切换函数功能实现的需要。

4 移植过程

μC/OS-II在设计的时候就已经考虑了将来在不同硬件平台的使用问题,在设计软件代码的时候把与硬件平台相关的代码分别放在了三个文件,分别是OS_CPU_C.C、OS_CPU_A.ASM和OS_CPU.H,所谓的移植,主要就是修改这三个与处理器相关的文件,在不同的微处理器上移植UCOS,其区别就在这三个文件中相关程序的编写。

4.1 OS_CPU.H的编写

在OS_CPU.H文件中,UCOS为了代码的直观性和可移植性,定义了不依赖于处理器平台的数据类型以及相关宏的定义,当运行在一具体处理器上的时候,需要根据处理器和编译器对这些数据类型做重新定义,因为即使同一数据类型在不同的处理器和编译器环境下代表的数据长度也是不一样的,结合ARM处理器的特性及ADS1.2编译器的特性,对数据类型做如下定义:

tyPedefunsigned char BOOLEAN;

tyPedefunsigned char INT8U;

tyPedefsigned char INT8S;

tyPedefunsigned short INT16U;

tyPedefsigned short INT16S;

tyPedefunsigned int INT32U;

tyPedefsigned int INT32S;

tyPedeffloat FP32;

tyPedefdouble FP64;

tyPedefINT32U OS_STK;

μC/OS-II使用结构常量OS_STK_GROWTH中指定堆栈的生长方式,ARM处理器支持四种堆栈[4]类型,但编译器ADS只支持满递减堆栈,所以做如下定义:

#define OS_STK_GROWTH 1

开关中断宏的定义:

#defineOS_ENTER_CRITICAL()ARMDisableInt()

#defineOS_EXIT_CRITICAL() ARMEnableInt()

普通任务切换宏的定义:

#define OS_TASK_SW() OSCtxSw()

4.2 OS_CPU_C.C编写

在这个文件中,一共是10个函数,一个OSTaskStkInit( ),9个Hook函数,在μC/OS中,多个任务轮流切换运行,当一个任务需要重新切换出来运行时需要得到上次被切换暂停时现场的相关数据,然后接着往下继续运行,这些数据就保存在每一个任务自己的私有堆栈区内,任务第一次运行时实际上是模拟其经过一次中断重新运行的结果,这时任务所需要的数据实际上就是任务堆栈初始化时的数据结构,完成这些数据在任务堆栈区的结构由函数OSTaskStk Init( )完成,其他9个Hook函数是留给用户扩展功能使用的,用户不需要的话可以保持其为空函数即可,本次移植中均为空函数,本次移植任务堆栈结构设计如图2所示。

系统堆栈初始化函数OSTaskStkInit( )在任务创建函数OSTaskCreat()中调用,返回值为该任务堆栈栈顶指针,这个指针会被赋给任务控制块的成员:OSTCBStkPtr,显然,得到某一任务的任务控制块就可访问到堆栈区,从而得到该任务重新切换运行所需的数据信息,把这些值送给处理器的相关寄存器,任务代码占领了处理器便开始运行,即该任务得到切换运行,OSTaskStkInit( )代码如下:

图2 堆栈结构图

4.3 OS_CPU_A.S的编写

操作系统的移植工作主要集中在这个文件中,工作量最大,一共需要实现6个汇编函数:void OSStartHighRdy(void)、void OSCtxSw(void)、void OSIntCtxSW(void)、void OSTick ISR(void)、unsigned int ARMDisabInt(void)、void ARMEnableInt(unsigned int)。

4.3.1 void OSStartHighRdy(void)的实现

这个函数在OSStart(void)中调用,功能是运行系统中最高优先级的任务,多任务系统UCOS刚一运行起来时,会根据算法计算出当前处于就绪态的最高优先级任务的优先级号OSPrioHighRdy,根据这个最高优先级号查找数组OSTCBPrioTbl[],从而访问到该任务的控制块OSTCBHighRdy,任务控制块结构体中访问该任务的堆栈指针SP,按照图2所示的任务堆栈结构将任务初次运行所需的相关初始化数据出栈送给处理器的相关寄存器,该任务即得到运行,下面给出其实现的示意性伪代码:

voidOSStartHighRdy(void)

{OSTaskSwHook();

OSRunning=True;

计算处于就绪态的优先级最高任务的优先级号;

得到要运行最高优先级任务控制块OSTCBHighRdy;

处理器的堆栈指针SP=OSTCBHighRdy->OSTCBStkPtr;

恢复堆栈中的各个字段到处理器的寄存器;

恢复PC字段,跳转到任务代码处运行;

4.3.2 void OSCtxSw(void)的实现

系统中任务级的切换函数,当任务需要主动放弃CPU的使用权(比如调用系统延时函数OSTimeDly()时),从而导致一次任务切换时,调用这个函数,在μC/OS-II中,这是通过宏调用实现,即define OS_TASK _SW OSCtxSw,系统调用OSSched()进行一次任务调度,在OSSched()中调用OS_TASK_SW,实际是执行的OSCtxSw,在这个函数中实现切换任务,当然在进入OS_TASK_SW前,系统会先计算出OSPrioHighRdy,以确定要切换出来运行的任务,给出OSCtxSw()示意性代码如下:

voidOSCtxSw(void)

保存处理器各寄存器值到当前任务堆栈;

保存当前堆栈地址到当前任务控制块的OSTCBStkPtr;

OSTaskSwHook();

OSPrio=OSPrioHighRdy;

OSTCBCur=OSTCBHighRdy;

处理器的堆栈指针SP=OSTCBHighRdy->OSTCBStkPtr;

恢复堆栈中数据到处理器各寄存器;

恢复PC字段,跳转到任务代码处运行;

4.3.3 void OSIntCtxSW(void)的实现

中断级任务切换函数,这个函数只在中断处理程序中被OSIntExit调用,UCOS系统响应中断的原理是当任务被中断打断去响应中断服务程序时,在执行中断服务程序的过程中如果使另外一个更高优先级的任务转变为就绪态,那么在中断服务程序退出后不会接着执行之前被打断的任务,而是切换到那个更高优先级的任务执行,因为在进入中断服务程序时任务的所有状态已经被保存到了任务堆栈中,所以这个函数只需要直接装载新任务的堆栈内容使其运行就可以了,当然在进入OSIntCtxSw(void)函数前,系统也会先计算出要运行的更高优先级任务的优先级号以用于访问该任务的相关数据结构,OSIntCtxSw(void)示意性代码如下:

voidOSIntCtxSw(void)

处理器的堆栈指针SP=OSTCBHighRdy->OSTCBStkPtr;

恢复堆栈中数据到处理器各寄存器;

恢复PC字段,跳转到任务代码处运行;

可见,内容和上面void OSCtxSw(void)函数的后半部分一样。

4.3.4 void OSTick ISR(void)的实现

系统时钟中断服务函数,μC/OS-II需要一个周期性的时钟信号才能运行,这个时钟信号由硬件处理器的定时器来实现,比如设定每隔10毫秒产生一次定时中断,每次定时时间间隔到,系统进入时钟中断服务程序OSTickISR(void),如果在定时中断处理过程中有更高优先级的任务进入就绪态,并且当前中断为中断嵌套的最后一层,那么在中断退出时,系统会调用OSIntExit函数实现任务切换,使更高级的就绪任务运行;如果在定时中断处理程序中没有出现更高优先级的任务进入就绪态,那么中断程序最后直接回到被中断的任务接着运行,另外,UCOS操作系统要求在系统时钟中断服务函数中调用系统函数OSTimeTick()来处理所有任务的定时操作,void OSTick ISR(void)代码示意如下:

void OSTick ISR(void)

保存被中断任务的现场数据到其私有堆栈中;

设置被中断任务TCB的堆栈栈顶指针;

OSIntEnter();

清中断标志位;

OSTimeTick();

OSIntExit();

恢复被中断任务的现场数据;

移植过程中,第一步“保存被中断任务的现场数据到其私有堆栈中”是实现重点,这里要保存的现场数据如图2所示,程序要按顺序实现图2中数据的入栈工作,本次移植的方案中,应用任务是设置运行在系统模式,发生定时中断ARM系统进入IRQ模式,而被中断任务的原先的堆栈区只能在系统模式才能访问,要想保存现场数据到任务堆栈中,需要从IRQ模式主动切换到系统模式,这可以IRQ模式中通过修改SPSR _irq值的模式位实现,此时,SPSR_irq和LR_irq是被中断任务现场数据的一部分,为了在切换到系统模式后能访问到并压入堆栈,可以把这个值先保存在设定的全局变量中,这样切换到系统模式后就能访问到这两个数据,其中,SPSR_irq的值修改模式位为系统模式后送到堆栈图中的CPSR位置,LR_irq的值减4后送到堆栈中的lr位置,其他寄存器R0—R12的值按照图2的顺序入栈就可以了。

4.3.5 unsigned int ARMDisabInt(void)、void ARMEnableInt(unsigned int)的实现

这两个函数是ARM系统开关中断函数,实现相对比较简单,通过汇编语句修改CPSR寄存器的中断允许位I即可。

5 移植测试

多任务系统能否稳定运行,移植后需要测试是否移植成功,在ADS中建立工程,创建两个任务Task1和Task2,分别控制开发板上的led亮灭和数码管显示,优先级分别为6、14。

voidMain(void)

ARMTargetInit();

OSInit();

OSTaskCreate(Task1,(void*)0,(OS_STK*)&StackLED[STACKSIZE-1],6);

OSTaskCreate(Task2,(void*)0,(OS_STK*)&StackSEG[STACKSIZE-1],14);

OSStart();

两个任务运行时可以在屏幕上打印出各自的运行信息,串口调试助手软件DNW上显示,如图3所示:

图3 DNW显示

同时,任务Task1运行时开发板上的4个跑马灯每隔100个时钟节拍闪烁一次;任务Task2每隔200个时钟节拍使开发板上的6个数码管从1到F循环显示一次,实验结果证明,μC/OS-II移植成功,可以稳定运行。

6 结语

本文在基于三星公司S3C2410 ARM处理器的开发板平台上,采用ADS集成开发环境,详细论述了嵌入式操作系统μC/OS-II的移植过程,给出了需要移植修改的地方,以伪代码的方式给出了移植编程思路,并重点阐述了难点即系统时钟中断服务函数实现,最后经过测试验证系统移植成功,该移植过程可以给嵌入式操作系统μC/OS-II在其他ARM处理器上的移植提供一定的借鉴作用,从而充分发挥基于ARM处理器嵌入式系统[5]的优良性能。

[1] 任哲.嵌入式实时操作系统UC/OS-II原理及应用[M].2版.北京:北京航空航天大学出版社,2009.

[2] 杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2008.

[3] 疏国会,金鑫.基于μC/OS的嵌入式系统应用开发平台的研究[J].制造业自动化,2012(4):145-147.

[4] 谢国波,罗路天.嵌入式系统层次体系结构模型研究[J].广东工业大学学报,2015(1):109-112.

[5] 刘芳宇.基于ARM嵌入式系统的设计及其应用[J].计算机光盘软件与应用,2012(9):173-174.

责任编辑:吴旭云

Research ofμC/OS-IITransPlantation Based on ARM Platform

CHEN Baoa,SHIFengb
(a.DePartment of Information and Electrical Engineering;b.DePartment of Academic Affairs,Xuzhou Institute of Technology,Xuzhou 221000,China)

With the introduction of the oPerating system to the embedded system,the stability and reliability of the embedded devices can be imProved and the develoPment efficiency of system software can also be sPed uP.The transPlantation ofμC/OS-II based on ARM Platform is comPleted in the PaPer and a detailed transPlantation Plan is given.The system oPerates stably after successful im-Plantation,which Provides some references forμC/OS-II transPlantation based on other Processors.

transPlantation;μC/OS-II;ARM

TP393.19

A

1009-3907(2015)06-0014-05

2015-03-10

2013年度徐州工程学院校级科研项目(XKY2013405)

陈豹(1980-),男,江苏徐州人,讲师,硕士,主要从事嵌入式系统方面研究,石锋(1982-),女,江苏徐州人,讲师,硕士,主要从事计算机应用方面研究。

猜你喜欢
堆栈寄存器中断
基于行为监测的嵌入式操作系统堆栈溢出测试*
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
移位寄存器及算术运算应用
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于堆栈自编码降维的武器装备体系效能预测
Lx5280模拟器移植设计及实施