实时操作系统μC/OS-II在ARM7上的移植
时间:05-12
来源:
点击:
1 引言
目前,嵌入式系统在家电、移动电话、PDA等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。对于不同的应用,可以按照相同的步骤完成系统设计。如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。
µC/OS-II是一种专门为微处理器设计的抢占式实时多任务操作系统,具有源代码公开、可移植性和可靠性高等特点。由于µC/OS-II是为嵌入式应用编写的通用软件,故在具体应用时需根据不同单片机的特点进行移植,其大部分代码是用标准C语言所写,只有与处理器相关的一部分代码用汇编语言编写,因而具有很强的移植性,能在从8位到64位单片机以及DSP等超过40种不同构架的微处理器上实现运行。本文主要介绍µC/OS-II在Samsung公司的一款ARM7TDMI的嵌入式处理器S3C44B0X上移植应用。
要实现µC/OS-II在S3C44B0X的构建、裁剪和移植,需要有S3C44B0X的编译器,本文采用的是英蓓特公司推出的EmbestIDE for ARM编译器。
2 µC/OS-II在S3C44B0X上移植的可行性分析
所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。要使µC/OS-II能够正常运行,处理器必须满足以下几个条件:
(1)处理器的C编译器能产生可重人代码;
(2)在程序中可以打开或者关闭中断;
(3)处理器支持中断,并且能产生定时中断(通常在l0~l000Hz之间);
(4)处理器支持能够容纳一定量数据的硬件堆栈;
(5)处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。Samsung公司的S3C44BOX处理器能够满足以上的要求,所以可以将µC/OS-II移植到S3C44B0X上。
3 µC/OS-II在S3C44B0X上移植的概要
µC/OS-II硬件和软件的体系结构如图1所示。从图中可以看出,对µC/OS-II的移植实际上就是对与处理器有关的代码进行重写或修改。本文中移植代码结构由四部分组成,分别是用户代码部分、核心代码部分、设置代码部分、与处理器相关的移植代码部分。用户代码即应用软件,用来实现用户的具体要求,例如本文中和PC机的串口通讯代码;核心代码部分, 包含OS_CORE.C、COS_FLAG.C、OS_MBOX.C、OS_MEME.C、OS_Q.C、OS_SEM.C、OS_TASK.C、OS_TIME.C、µC/OS-II.C、µC/OS-II.H 十个文件;设置代码部分,即µC/OS-II配置代码,包含OS_CFG.H、INCLUDES.H 两个文件,用来配置事件控制块的数目以及是否包含消息管理相关代码等;与处理器相关代码即µC/OS-II要移植的处理器配置代码,包含OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三个文件,在µC/OS-II的移植过程中,用户所需要关注的就是这部分文件。
图1 µC/OS-II软硬件体系结构
4 µC/OS-II在S3C44B0X上移植代码分析
4.1 OS_CPU.H文件分析
OS_CPU.H包括用#define定义的与处理器有关的常量、宏和类型定义。
(1)定义与编译器相关的数据类型。
µC/OS-II为了保证可移植性,程序中没有直接使用int、unsigned int等定义,而是自己定义了一套数据类型,例如,INT8U表示8位无符号整型,INT16U表示16位无符号整型等。对于ARM这样的32位内核,INT16U是unsigned short型;若是16位的处理器,则是unsigned int型。不能使用bit型变量,把BOOLEAN型定义成unsigned char型。另外S3C44B0X数据宽度和堆栈宽度都是32位,分别将OS_STK和OS_CPU_SR定义成unsigned int型。
(2)义堆栈增长方向
在µC/OS-II中,用OS_STK_GROWTH来设置堆栈的增长方向,OS_STK_GROWTH为0表示堆栈从低地址向高地址增长;OS_STK_GROWTH为l表示堆栈从高地址向低地址增长,其宏定义为:
#define OS_STK_GROWTH l; //堆栈从高地址向低地址增长
#define OS_STK_GROWTH 0; //堆栈从低地址向高地址增长
(3)代码临界区
µC/OS-II在进入系统临界代码区之前需关中断,退出临界区后再开中断,则µC/OS-II能够保护临界区代码免受多任务或中断服务例程的破坏。在S3C44B0X中,通过设置状态寄存器CPSR中的中断禁止位来实现。µC/OS-II中的宏#define OS_ENTER_CRITICAL() IRQFIQDE定义将状态寄存器中的中断禁止位置位,以禁止所有的中断;#define OS_EXIT_CRITICAL() IRQFIQRE定义将状态寄存器的中断禁止位置零,以允许所有的中断。
(4) 定义OS_TASK_SW宏
OS_TASK_SW宏是µC/OS-II从低优先级任务切换到高优先级任务时的调度,可以采用下面两种方式定义:一种是如果处理器支持软中断,那么可以使用软中断将中断向量指向OSCtxSw函数;另一种是直接调用OSCtxSw函数。本文用的是后一种方式。
目前,嵌入式系统在家电、移动电话、PDA等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。对于不同的应用,可以按照相同的步骤完成系统设计。如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。
µC/OS-II是一种专门为微处理器设计的抢占式实时多任务操作系统,具有源代码公开、可移植性和可靠性高等特点。由于µC/OS-II是为嵌入式应用编写的通用软件,故在具体应用时需根据不同单片机的特点进行移植,其大部分代码是用标准C语言所写,只有与处理器相关的一部分代码用汇编语言编写,因而具有很强的移植性,能在从8位到64位单片机以及DSP等超过40种不同构架的微处理器上实现运行。本文主要介绍µC/OS-II在Samsung公司的一款ARM7TDMI的嵌入式处理器S3C44B0X上移植应用。
要实现µC/OS-II在S3C44B0X的构建、裁剪和移植,需要有S3C44B0X的编译器,本文采用的是英蓓特公司推出的EmbestIDE for ARM编译器。
2 µC/OS-II在S3C44B0X上移植的可行性分析
所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。要使µC/OS-II能够正常运行,处理器必须满足以下几个条件:
(1)处理器的C编译器能产生可重人代码;
(2)在程序中可以打开或者关闭中断;
(3)处理器支持中断,并且能产生定时中断(通常在l0~l000Hz之间);
(4)处理器支持能够容纳一定量数据的硬件堆栈;
(5)处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。Samsung公司的S3C44BOX处理器能够满足以上的要求,所以可以将µC/OS-II移植到S3C44B0X上。
3 µC/OS-II在S3C44B0X上移植的概要
µC/OS-II硬件和软件的体系结构如图1所示。从图中可以看出,对µC/OS-II的移植实际上就是对与处理器有关的代码进行重写或修改。本文中移植代码结构由四部分组成,分别是用户代码部分、核心代码部分、设置代码部分、与处理器相关的移植代码部分。用户代码即应用软件,用来实现用户的具体要求,例如本文中和PC机的串口通讯代码;核心代码部分, 包含OS_CORE.C、COS_FLAG.C、OS_MBOX.C、OS_MEME.C、OS_Q.C、OS_SEM.C、OS_TASK.C、OS_TIME.C、µC/OS-II.C、µC/OS-II.H 十个文件;设置代码部分,即µC/OS-II配置代码,包含OS_CFG.H、INCLUDES.H 两个文件,用来配置事件控制块的数目以及是否包含消息管理相关代码等;与处理器相关代码即µC/OS-II要移植的处理器配置代码,包含OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三个文件,在µC/OS-II的移植过程中,用户所需要关注的就是这部分文件。
图1 µC/OS-II软硬件体系结构
4 µC/OS-II在S3C44B0X上移植代码分析
4.1 OS_CPU.H文件分析
OS_CPU.H包括用#define定义的与处理器有关的常量、宏和类型定义。
(1)定义与编译器相关的数据类型。
µC/OS-II为了保证可移植性,程序中没有直接使用int、unsigned int等定义,而是自己定义了一套数据类型,例如,INT8U表示8位无符号整型,INT16U表示16位无符号整型等。对于ARM这样的32位内核,INT16U是unsigned short型;若是16位的处理器,则是unsigned int型。不能使用bit型变量,把BOOLEAN型定义成unsigned char型。另外S3C44B0X数据宽度和堆栈宽度都是32位,分别将OS_STK和OS_CPU_SR定义成unsigned int型。
(2)义堆栈增长方向
在µC/OS-II中,用OS_STK_GROWTH来设置堆栈的增长方向,OS_STK_GROWTH为0表示堆栈从低地址向高地址增长;OS_STK_GROWTH为l表示堆栈从高地址向低地址增长,其宏定义为:
#define OS_STK_GROWTH l; //堆栈从高地址向低地址增长
#define OS_STK_GROWTH 0; //堆栈从低地址向高地址增长
(3)代码临界区
µC/OS-II在进入系统临界代码区之前需关中断,退出临界区后再开中断,则µC/OS-II能够保护临界区代码免受多任务或中断服务例程的破坏。在S3C44B0X中,通过设置状态寄存器CPSR中的中断禁止位来实现。µC/OS-II中的宏#define OS_ENTER_CRITICAL() IRQFIQDE定义将状态寄存器中的中断禁止位置位,以禁止所有的中断;#define OS_EXIT_CRITICAL() IRQFIQRE定义将状态寄存器的中断禁止位置零,以允许所有的中断。
(4) 定义OS_TASK_SW宏
OS_TASK_SW宏是µC/OS-II从低优先级任务切换到高优先级任务时的调度,可以采用下面两种方式定义:一种是如果处理器支持软中断,那么可以使用软中断将中断向量指向OSCtxSw函数;另一种是直接调用OSCtxSw函数。本文用的是后一种方式。
实时操作系统 micro C OS-II ARM7 移植 相关文章:
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- VXWORKS内核分析(11-11)
- 嵌入式实时操作系统设计探讨(10-15)
- 嵌入式实时操作系统μC/OS-II 在P89V51RD2中的移植(04-09)
- LPC2292的伪中断与伪中断处理(03-25)
- 网络处理器IP2022及其在嵌入式牌照识别系统中的应用设计(05-16)