嵌入式操作系统UC/OSII bc45编译ucos-II的过程
嵌入式操作系统UC/OSII bc45编译ucos-II的过程
摘要:嵌入式系统的应用和发展是计算机技术自桌面系统和网络技术之后,IT产业和IT技术又一 个新的重大进展。而对于规模比 较小的系统,UC/OSII 则以实时行强,内核公开,系统稳定,易于学习和开发等特点受到广大技术人员和嵌入式爱好者的青睐。本文以UC/OSII为例介绍嵌入式uC/OS-II实时操作系统在嵌入式平台上的移植程序及方法。
关键词:嵌入式;UC/OSII;实时操作系统;开发流程;移植μC/OS-Ⅱ
1 引言
在日常生活等各个领域.当前流行的嵌入式操作系统有linux,wince, UC/OSII 等等。我国正在成为世界电子制造业的重要基地之一,对嵌入式系统技术及相关技术人才存在巨大需求。
2 uC/OS-II的移植程序
将μC/OS-Ⅱ移植到不同的处理器上。所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求:
1. 处理器的C编译器能产生可重入代码。
用C语言就可以打开和关闭中断。
处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中指令。
像Motorola 6805系列的处理器不能满足上面的第4条和第5条要求,所以μC/OS-Ⅱ不能在这类处理器上运行。
移植工作包括以下几个内容:
用#define设置一个常量的值(OS_CPU.H)
声明10个数据类型(OS_CPU.H)
用#define声明三个宏(OS_CPU.H)
用C语言编写六个简单的函数(OS_CPU_C.C)
编写四个汇编语言函数(OS_CPU_A.ASM)
一旦代码移植结束,下一步工作就是测试。
3 UCOS在51单片机的移植
任务函数中带有形参和局部变量时若使用reentrant关键字会引起重入,从C51.PDF 129-131页的内容知:为了函数重入,形参和局部变量必须保存在堆栈里,由于51硬件堆栈太小,KEiL将根据内存模式在相应内存空间仿真堆栈(生长方向由上向下,与硬件栈相反)。对于大模式编译,函数返回地址保存在硬件堆栈里,形参和局部变量放在仿真堆栈中,栈指针为?C_XBP,XBPSTACK=1时,起始值在startup.a51中初始化为FFFFH+1。
为了支持重入,重新设计了堆栈结构。增加了保存仿真堆栈指针?C_XBP和堆栈内容的数据结构。相应改变的文件有:OS_CPU_A.ASM、OS_CPU_C.C、OS_CPU.H、YY.C。建议使用统一的固定大小的堆栈空间,尽管uCOSII原作者把不同任务使用不同空间看成是优点,但为了在51上有效实现任务重入,还是不使用这个优点。
用户堆栈空间的大小是可以精确计算出来的。用户堆栈空间=硬件堆栈空间+仿真堆栈空间。硬件栈占用内部RAM,内部RAM执行效率高,如果堆栈空间过大,会影响KEIL编译的程序性能。如果堆栈空间小,在中断嵌套和程序调用时会造成系统崩溃。综合考虑,可把硬件堆栈空间大小定成了64字节,用户根据实际情况可以自行设定。仿真堆栈大小取决于形参和局部变量的类型及数量,可以精确算出。因为所有用户栈使用相同空间大小,所以取占用空间最大的任务函数的空间大小为仿真堆栈空间大小。这样用户堆栈空间大小就唯一确定了。可将用户堆栈空间大小用宏定义在OS_CFG.H文件中,宏名为MaxStkSize。
51的SP只有8位,无法在64K空间中自由移动,只好采用拷贝全部硬件堆栈内容的笨办法。51本来就弱,这么一来缺点更明显了。其实,引入OS必然要付出代价,一般OS要占用CPU10%-20%的负荷能力,需权衡利弊决定。切换频率决定了CPU的耗费,频率越高耗费越大,大到一定程度就该换更强的CPU了。我选了50Hz的切换频率,不高也不低,用户可以根据需要自行定夺。
4 μC/OS-II在嵌入式开发平台上进行移植的一般方法和技巧
在选定了系统平台和开发工具之后,进行μC/OS-II的移植工作,一般需要遵循以下的几个步骤:
深入了解所采用的系统核心
分析所采用的C语言开发工具的特点
编写移植代码
进行移植的测试
针对项目的开发平台,封装服务函数 (类似80x86版本的PC.C和PC.H)
系统核心
无论项目所采用的系统核心是MCU、DSP、MPU,进行μC/OS-II的移植时,所需要关注的细节都是相近的。
首先,是芯片的中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等。还有,芯片是否有软中断或是陷阱指令,又是如何触发的。
此外,还需关注系统对于存储器的使用机制,诸如内存的地址空间,堆栈的增长方向,有无批量压栈的指令等。
植代码
在深入了解了系统核心与开发工具的基础上,真正编写移植代码的工作就相对比较简单了。
μC/OS-II自身的代码绝大部分都是用ANSI C编写的,而且代码的层次结构十分干净,与平台相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H这三个文件当中。
在移植的时候,结合前面两个步骤中已经掌握的信息,基本上按照《嵌入式实时操作系统μC/OS-II》一书的相关章节的指导来做就可以了。
但是,由于系统核心、开发工具的千差万别,在实际项目中,一般都会有一些处理方法上的不同,需要特别注意。以C6711的移植为例:
※ 中断的开启和屏蔽的两个宏定义为:
#define OS_ENTER_CRITICAL() Disable_int()
#define OS_EXIT_CRITICAL() Enable_int()
Disable_int和Enable_int是用汇编语言编写的两个函数。在这里使用了控制状态寄存器(CSR)的一个特性——CSR中除了控制全局中断的GIE位之外,还有一个PGIE位,可用于保存之前的GIE状态。
- 上一篇:中标软件 国产操作系统的机遇
- 下一篇:智能卡操作系统(cos)仿真器系统设计与实现