摘要:当前,传统的前后台系统已成为阻碍嵌入式系统发展的一大瓶颈,嵌入式操作系统的使用,能够简化嵌入式系统的应用开发,有效地确保系统的实时性和稳定性。本文以此为背景,阐述了嵌入式操作系统µc/OS -Ⅱ移植到基于ARM7的S3C44B0X芯片移植过程。最终使嵌入式系统开发平台得以实现。
论文关键词:嵌入式,S3C44B0X,实时内核µc/OS-Ⅱ,移植
是非常必要的。而操作系统是一个通用的程序,要在自己的嵌入式系统中应用它,必须结合所用处理器的不同进行相应边编写或改写。本文结合实例,对基于S3C44B0X的嵌入式操作系统µc/0S-Ⅱ平台的实现的移植过程进行研究,最后通过测试,验证了嵌入式开发平台的成功实现。
1、 实时内核µc/OS-Ⅱ
µc/OS-Ⅱ,是一个可固化、可裁剪、占先式的实时多任务操作系统,它运行就绪状态下优先级最高的任务,绝大部分源代码是用便于移植的C语言编写,小部分汇编语言代码已被压缩到最低限度,使之可供不同构架的微处理器上使用[3]。µc/OS -Ⅱ所具有源代码公开、执行效率高、占用空间小等特点受到广大用户的青睐。
2 μC/ OS - II 在S3C44B0X上的移植
移植就是指使一个实时内核能在其它微处理器或微控制器上运行。本文采用S3C44B0X芯片,开发环境采用Keil uVision3 ,基本满足开发要求。S3C44BOX是一款基于ARM7的SOC芯片。该芯片片上功能强大,技术成熟,具有低成本、低功耗、高性能等优点[1]。
移植工作主要集中在与处理器相关的3个文件中[2]:OS_CPU.H 、OS_ CPU_ C. C 、OS_ CPU_A.S。其中:OS_ CPU.H 文件主要包含与编译器相关的数据类型定义、堆栈类型定义、两个宏定义和几个函数说明;OS_ CPU_ C. C 包含与移植有关6个C函数,为OSTaskStkInit(), OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTick_
Hook(),其中后面5个函数为钩子函数,可以没有实际内容, 但必须要声明,用于扩充自己需要的功能。OS_CPU_A.S 中包含与移植有关的4个汇编语言函数,为OSStartHigh()、OSCtxSW()
、OSIntCtxSw(),OSTickISR()。
2.1 OS_CPU. H文件移植
此文件中主要包含与编译器相关数据类型定义、堆栈类型定义、两个宏定义和几个函数说明。数据类型定义部分代码如下[3]:
typedef unsigned short INT16U; /*16位有符号整数*/
typedef unsigned long INT32U; /*32位无符号整数*/
typedef unsigned int OS_STK;/*堆栈入口宽度为16位*/
#define OS_STK_GROWTH 1 /*堆栈增长方向从上向下满递减堆栈*/
#define OS_ENTER_CRITICAL() {cpu_sr =OS_CPU_SR_Save();}/*关中断,执行临界代码*/
#define OS_EXIT_CRITICAL() { OS_CPU_SR_Restore (cpu_sr);}/*开中断*/
在本例移植中,使用软中断指令SWI作为底层接口,使用不同功能号区分不同函数。用关键字_swi 声明一个不存在的函数,则调用该函数就在调用的地方插入一条SWI指令并可指定功能号。SWI函数部分代码如下[3]:
_swi(0x00) void OS_TASK_SW(void); /*任务级任务切换函数*/
_swi(0x01) void_OSStartHighRdy( void);/ *运行优先级最高的任务*/
_swi(0x02) void OS_ENTER_CRITICAL(void) ; /*关中断* /
_swi(0x03) void OS_EXIT_CRITICAL(void) ; / * 开中断* /
2.2 OS_CPU_C. C 文件移植
µc/OS-Ⅱ中,每个任务要有自己的堆栈空间,以便进行任务切换时保存和恢复现场。因此必先确定任务堆栈结构,而任务堆栈结构与CPU体系结构、编译器密切关联。
OSTaskStkInit() 函数关键代码如下:
*--stk=(unsigned int)task; /*pc*/
*--stk=(unsigned int)task /*lr*/
*--stk=0; /*r12.....r1,其它同理*/
*--stk=(unsigned int)pdata; /*r0,第一个参数用r0传递*/
*--stk=(SVC32MODE|0x0|); /* cpsr 关闭irq,fiq*/
*--stk=(SVC32MODE|0x0); /*spsr IRQ,关闭FIQ*/
return((OS_STK *)stk);/*堆栈指针保存在任务的OS_TCB中*/
此文件中的几个系统规定的hook函数在本移植均将它们都设置为空函数。
2.3 OS_CPU_ A. S 文件移植
此文件中需要编写4 个汇编语言函数[3]:
OSStartHighRdy()、OSCtxSw()、OSIntCtxSw( )、OSTickISR( )。
多任务启动函数OSStart( )调用OSStartHightRdy( )函数, 运行优先级最高的任务。OSCtxSw()函数是由任务级任务切换函数OS_TASK_SW()调用,实现从低优先级向高优先级切换。文中任务级切换是通过SWI软中断来实现的。软中断的异常处理程序挂接到CPU内核,通过修改启动代码里的异常向量表实现。中断服务程序与CPU 芯片相关,中断源的挂接通过增加汇编接口的支持来实现,即在文件IRQ.S的适当位置添加如下的程序代码[2]:
IRQ.Handler HANDL ER IRQ.Exception ; IRQ 中断
OSIntCtxSw()是中断级任务切换函数,在中断退出时由函数OSIntExit()调用。此函数基本原理与任务级切换相同,只是由于进入中断时已保存了被中断任务的环境变量,就不进行类似操作,只需要对堆栈指针进行调整即可。
1/2 1 2 下一页 尾页 |