APP下载

μC/OS-II系统的移植分析与应用

2013-12-10西安翻译学院汤宏萍薛根福

电子世界 2013年4期
关键词:编译器堆栈内核

西安翻译学院 汤宏萍 薛根福

1.引言

嵌入式系统[1]主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成。嵌入式操作系统作为嵌入式系统的核心组成部分,必须具备良好的可移植性才能满足嵌入式系统的多样化需求。µC/OSII[1]是用ANSI的C语言编写的,它是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核操作系统。至今,从8位到64位,µC/OS-II已经在各种不同架构的微处理器上运行,目前市场上已经有许多应用µC/OS-II的嵌入式产品,因此研究µC/OS-III操作系统及其移植技术很有价值。文章首先对µC/OS-II操作系统的移植可行性进行分析,然后结合基于ARM体系LPC2294处理器的EASYARM开发板阐述了µC/OS-II系统移植的一般过程,最后对µC/OS-II系统的移植进行了测试。

2. C/OS-II操作系统移植的可行性分析

2.1 µC/OS-II操作系统移植的条件

要使µC/OS-II正常运行,处理器必须需满足以下要求[2]:

①处理器的C编译器能产生可重入代码;

②用C语言可以开/关中断;

③处理器支持中断,并且能够产生定时中断;

④处理器能够支持容纳一定量数据的硬件堆栈;

⑤处理器有将堆栈指针和其他寄存器读出和存储到堆栈或内存中的指令。

在采用µC/OS-II系统的移植中,作者采用ARM LPC2294[3]微控制器,该微控制器可以满足上述②、④、⑤条件,而ADS1.2的C编译器可以满足①、③的要求。

2.2 µC/OS-II操作系统软件的体系结构是移植的基础

所谓移植[2],就是使一个实时内核能在微处理器或微控制器上运行。在设计之初,µC/OS-II就考虑到嵌入式系统硬件平台的多样性和操作系统的可移植性问题,大部分代码采用C语言开发,只有部分与处理器硬件相关的代码采用汇编语言编写,而且整个系统采用模块化设计,将不同功能的软件分成不同的组件,分别位于系统的不同层次。这种可复用的层次结构是实现µC/OS-II可配置性、可移植性、兼容性以及可扩展性的基础,µC/OS-II系统软件的体系结构如图1所示[2]。

在图1中,包含以下三个部分:

核心部分:该部分代码与处理器的类型无关,包含了1个头文件和7个用C语言编写的源文件。主要功能是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理。

配置文件部分:主要功能是配置事件控制块数目和是否包含消息管理的相关代码。

移植代码部分:这部分是与处理器相关的代码,包含一个头文件、一个汇编源码文件和一个C源码文件。

3. C/OS-II操作系统移植应用

3.1 µC/OS-II移植的硬件资源

在移植系统之前,首先必须了解目标系统的硬件资源,根据目标系统特定的硬件资源完成系统移植。应用中的目标系统采用EASYARM2200开发板,它属于ARM体系结构,主要硬件资源如下:

处理器:ARM体系16/32位嵌入式处理器LPC2294;

内存:16KB RAM,256KB Flash;

外围设备控制器:CAN口、RS-232串行口、以太网控制器RTL8019;

调试接口:ARM-ICE JTAG。

3.2 移植具体步骤

与处理器相关代码是移植过程中最关键的部分,内核将应用系统和底层硬件有机的结合成一个实时系统。要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码,处理器不同,这部分代码也不同。在µC/OS-II中,这部分代码分成3个文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU.C。

(1)OS_CPU.H包括用#define定义的与处理器相关的常量、宏和类型定义。依据LPC2294所支持的数据类型定义相关常量,定义栈增长的方向为1,即从高地址往低地址递减生长;开关中断这里采用的是定义的函数OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL();定义用系统的软中断OS-TASKSW()进行任务切换。

(2)OS_CPU_A.ASM这部分需要对处理器的寄存器进行操作,所以必须由汇编语言来编写,主要编写4个函数OSStartHighRdy(0,OSCtxSw(),OSIntCtxSw(0,OSTickISR()。

OSStartHighRdy()功能:通过设置系统运行标志位OSRunning=TRUE,将就绪表中最高优先级任务的栈指针装载到SP中,并强制中断返回。

OSCtxSw()功能:通过先前在OS_CPU.H中定义的软中断指令进行任务级切换。中断服务子程序、陷阱、异常处理的向量地址必须指向OSCtxSw()

图1 C/OS-II系统软件的体系结构

OSIntCtxSw()功能:实现中断级任务切换。与OSCtxSw()函数类似,只是少了一些保存某些寄存器的工作。

OSTickISR()是系统时钟节拍中断服务函数。这是一个周期性中断,为内核提供时钟节拍,频率越高,负担越重。必须是在调用OSStart()之后启动时钟节拍中断。

(3)OS_CPU.C这部分定义了6个函数。其中最重要的是OSTaskStkInit(),它是用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化,使建立好的进入就绪态任务的堆栈与系统发生中断并且与环境变量保存完毕时的堆栈结构一致。其余函数必须声明,但可以不包含任何代码,这些函数可以作为内核函数的补充。为了使程序执行效率高,在本次移植中OSTaskStkInit()是用汇编编写的。

4.测试移植代码[2]

完成将µC/OS-II移植到处理器上后,下一步工作就是验证移植后µC/OS-II操作系统是否正常工作,这也是移植中最复杂的一步。测试分为2种情况:首先不加任何应用代码来测试移植好µC/OS-II,即首先测试内核自身的运行状况。这样做有两个好处:首先,用户不希望将事情复杂化;其次,如果有些部分没有正常工作,可以明白是移植本身的问题,而不是应用代码产生的问题。如果已经将2个基本的任务和节拍中断运行起来,那么接下来的添加应用任务是非常简单的。其次是建立基于信号量进行通信的几个任务,在此基础上验证内核的多任务调度是否正确,从而验证系统移植成功与否。本文通过4个步骤测试移植代码:

(1)确保C编译器、汇编编译器及链接器正常工作

当修改完需要根据CPU更改的文件后,紧接着要把这些文件和µC/OS-II中与处理器无关的文件一同编译和链接。显然,这个步骤取决于使用的编译器。测试需要用到3个文件:TEST.C、INCLUDES.H、OS-CFG.H。TEST.C程序如下:

(2)验证OSTaskStkInit()和OSStart-HighRdy()函数

首先,修改OS-CFG.H,设置OS-TASKSTAT-EN为0,以禁止统计任务。在TEST.C里并没有添加任何应用任务,所以惟一的任务是UC/OS-II的空闲任务OS-TaskIdle()。一直单步执行,直到UC/OS-II运行到调用OSStartHighRdy()。这时,编译器应该切换到汇编模式下,因为OSStartHighRdy()是用汇编语言实现的。OSStartHighRdy()会开始运行第一个任务;而此时并没有任何应用任务,只有OS-TaskIdle()可以运行。继续单步执行,同时检查是否出错。实际上,OSStartHighRdy()会将OSTaskStkInit()推入堆栈的CPU寄存器,并按照相反的方向顺序弹出。如果这一点不正确,堆栈指针就会出错。这时应该校正OSTaskStkInit()函数。OSStartHighRdy()的最后一条语句会从中断中返回。一旦执行这条语句,调试器就应该指向OS-TaskIdle()的第一条指令。如果这一步没有发生,那么可能是因为没有将正确的任务起始指针放在任务堆栈中,这时也需要修改OSTaskStkInit()函数。如果调试器在OSTaskStkInit()的循环中执行,且在无限循环中已经执行几次,那么就验证了OSTaskStkInit()和OSStartHighRdy()是正确的。

(3)验证OSCtxSw()函数

在这一步的测试中,添加了一个应用程序,并不断切换到空闲任务。

可以单步执行进入OSTimeDly()函数。当调用OSTimeDly(1)时,会发生任务切换。如果OSTimeDly()代码正确,LED会快速闪烁。

(4)验证OSIntCtxSw()函数和OSTick-ISR()函数。

5.结束语

嵌入式系统是一个软硬件集合体,而作为嵌入式系统的核心组件嵌入式操作系统必须具备良好的可移植性以适应各种不同处理器体系结构的嵌入式应用需求。本文成功地将嵌入式操作系统µC/OS-II移植到了LPC2294上,并详细阐述了µC/OS-II的系统移植的一般过程,为嵌入式开发者提供参考。

[1]唐恒娟等.eCos系统移植分析与应用[J].微电子学与计算机,2006,23(3).

[2]Jean J.Labrosse.邵贝贝.嵌入式实时操作系统μCOS-Ⅱ[M].北京:北京航空航天大学出版社,2003:72-115.

[3]周立功.ARM嵌入式系统基础教程[M].北京航空航天大学出版社,2005.

猜你喜欢

编译器堆栈内核
基于行为监测的嵌入式操作系统堆栈溢出测试*
强化『高新』内核 打造农业『硅谷』
基于相异编译器的安全计算机平台交叉编译环境设计
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
基于堆栈自编码降维的武器装备体系效能预测
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证
提升影视文化软实力的人文内核审视
通用NC代码编译器的设计与实现
一种用于分析MCS-51目标码堆栈深度的方法