Board logo

标题: uC/OS-II在EP7312上的移植 01 [打印本页]

作者: samwalton    时间: 2014-4-26 14:17     标题: uC/OS-II在EP7312上的移植 01

随着Internet和后PC时代的到来,嵌入式系统的应用愈来愈广泛,嵌入式产品在人们的生活中无处不在。今天,嵌入式系统带来的工业年产值已超过1万亿美元,已经在IT产业中占有很大的比重。
  通常,应用程序对嵌入式软件的基本要求是体积小、执行速度快、具有较好的裁减性和可移植性。嵌入式软件的灵魂是嵌入式操作系统。在特定的操作系统之上开发应用软件,可以让程序开发人员屏蔽掉很多低层硬件细节,使得应用程序调试方便、移植简单、易维护,同时开发周期也短。目前,实时操作系统很多,如VxWorks、Window CE、pSOS、QNX、LynxOS等等。这些操作系统都具有高可靠性、很强的实时性等特点,但它们都是商业操作系统,价格昂贵,人们往往很难接受。μC/OS-II的出现是对这些商业操作系统的一个很大的冲击。μC/OS-II是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求。裁减掉不需要的部分,使操作系统变得小巧、灵活,并且能满足用户特定操作系统的需要。
1 μC/OS-II简介
  μC/OS-II并非一个完整的实时操作系统,它只是一个实时内核。μC/OS-II不像其它实时操作系统一样,提供给用户的是一个标准的API函数,程序开发人员利用操作系统提供的API函数进行应用程序的开发。要想在μC/OS-II内核上进行应用程序的开发,就需要程序开发人员在实时内核的基础上建立自己的实时操作系统。首先,把μC/OS-II移植到自己的硬件目标板上,写出相应的驱动程序以及用户图形界面等等;在这些接口函数之上,加上用户自己的应用程序,就构成了嵌入式软件。
2 μC/OS-II在EP7312上的移植
  μC/OS-II的移植条件是:只要该处理器有堆栈,有CPU内部寄存器入栈、出栈指令;使用的C编译器支持内嵌汇编(inline assembly)或者该C语言可扩展,可连接汇编模块,使得关中断、开中断能在C语言程序中实现。Cirrus Logic公司生产的EP7312芯片内部采用的是arm720T处理器,内部有37个寄存器。其中R13通常用作堆栈指针。堆栈寻址是隐含的,堆栈指针所指定的存储单元就是堆栈的栈顶,堆栈寻址通常有两种方式向上生长和向下生长。ARM处理器有ARM和Thumb两种指令集。每种指令集都有丰富的指令可以对堆栈进行操作。堆栈指针指向最后压入堆栈的有效数据,称为满堆栈(full stack);堆栈指针指向下一个数据项放入的空位置,称为空堆栈(empty stack)。根据堆栈的生长方向不同,可以生成4种类型的堆栈,即满递增、空递增、满递减、空递减。我们所使用的ARM SDT(arm Software Development Kit)开发系统内含的编译器,同样也支持内嵌汇编,所以μC/OS-II完全可以移植到EP7312上。
  μC/OS-II核心代码很小,程序开发人员要把它移植到自己的目标板中只需做少量的工作。图1是μC/OS-II硬件和软件的体系结构。
  虽然μC/OS-II大部分源代码是用C语言写的,但是完成和处理器一些有关的代码时,还是必须要用汇编语言来实现的。寄存器的读、写只能通过汇编语言的存储和加载指令来实现。要使μC/OS-II能够正常工作, 处理器必须满足以下要求:
 ① 处理器的C编译器能产生可重入代码;
 ② 用C语言可以打开和关闭中断;
 ③ 处理器支持中断,并且能够产生定时中断(通常在10~100Hz之间);
 ④ 处理器能够支持容纳一定量数据的硬件堆栈;
 ⑤ 处理器有将堆栈指针和其它寄存器读出和存储到堆栈或内存中的指令。
  μC/OS-II的移植包括以下几个部分。
    (1)设置与编译器有关的代码[OS_CPU.H]
  在不同的处理器中有不同的字长,所以必须定义一系列数据类型以确保移植的正确性。另外,在μC/OS-II中,不使用C的short、int和long等数据类型,这些都是和编译器相关的。下面就是μC/OS-II定义的一部分数据类型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /*无符号8位整数 */
typedef signed char INT8S; /*有符号8位整数 */
typedef unsigned int INT16U; /*无符号16位整数 */
typedef signed int INT16S; /*有符号16位整数 */
typedef unsigned long INT32U; /*无符号32位整数 */
typedef signed long INT32S; /*有符号32位整数 */
typedef float FP32; /*单精度浮点数 */
typedef double FP64; /*双精度浮点数 */
  μC/OS-II需要先禁止中断访问代码的临界区,并且在访问完毕后重新允许中断。μC/OS-II定义了两个宏来禁止和允许中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
#define OS_ENTER_CRITICAL() IRQFIQDE
#define IRQFIQDE __asm
{
mrs r0, CPSR;
stmfd sp!, {r0};
orr r0, r0, #NOINT;
msr CPSR_c, r0;
}
#define OS_EXIT_CRITICAL() IRQFIQRE




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0