uC/OS-II操作系统移植
---------------------------------------------------------
Author :tiger-john
WebSite :blog.csdn.net/tigerjb
Email :[email protected]
编译环境:Keil uVision3
开发板 :ARM LPC 2368
---------------------------------------------------------
一.移植相关文件
μC/OS-II的代码包括核心代码(与处理器无关),配置代码(与用户实际应用相关)和移植代码。其中移植μC/OS-II所需的代码是移植代码,移植代码包括1个汇编文件(OS_CPU_A.ASM),1个C程序文件(OS_CPU_C.C)和1个头文件(OS_CPU.H)。由于Keil uVision3编译器默认汇编文件后缀名为“S”,所以移植代码OS_CPU_A.ASM改名为OS_CPU_A.S。
uC/OS-II核心代码与处理器无关,所以不管移植到哪个板子上,它们都是不用修改的,可直接粘贴过去。
我们主要的工作是OS_CPU.H,OS_CPU_A.ASM(在Keil 中为OS_CPU_A.S)和OS_CPU_C.C因为它们是处理器相关的。
1. OS_CUP.H
先看下代码:
/****************************************Copyright (c)************************************************** ** 西安邮电学院 ** XNMS项目组 ** ** ** http://blog.csdn.net/tigerjb ** **-----------------------------------------文件信息------------------------------------------------------ **文 件 名: os_cpu.h **创 建 人: 冀博 **最后修改日期: 2010年1月14日 **描 述: μCOS-II在LPC210x上的移植代码CPU配置部分,用Keil uVision3编译 ********************************************************************************************************/ #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif /********************************************************************************************************** * 定义与编译器无关的数据类型 **********************************************************************************************************/ typedef unsigned char BOOLEAN; /* 布尔变量 */ typedef unsigned char INT8U; /* 无符号8位整型变量 */ typedef signed char INT8S; /* 有符号8位整型变量 */ typedef unsigned short INT16U; /* 无符号16位整型变量 */ typedef signed short INT16S; /* 有符号16位整型变量 */ typedef unsigned int INT32U; /* 无符号32位整型变量 */ typedef signed int INT32S; /* 有符号32位整型变量 */ typedef float FP32; /* 单精度浮点数(32位长度) */ typedef double FP64; /* 双精度浮点数(64位长度) */ typedef INT32U OS_STK; /* 堆栈是32位宽度 */ /* 以下是兼容UC/OS V1.XX的数据类型,在uC/OS-II没有使用 */ #define BYTE INT8S #define UBYTE INT8U #define WORD INT16S #define UWORD INT16U #define LONG INT32S #define ULONG INT32U /* ********************************************************************************************************* * 与ARM7体系结构相关的一些定义 **********************************************************************************************************/ #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式 */ __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); /* 开中断 */ __swi(0x40) void *GetOSFunctionAddr(int Index); /* 获取系统服务函数入口 */ __swi(0x41) void *GetUsrFunctionAddr(int Index);/* 获取自定义服务函数入口 */ __swi(0x42) void OSISRBegin(void); /* 中断开始处理 */ __swi(0x43) int OSISRNeedSwap(void); /* 判断中断是否需要切换 */ __swi(0x80) void ChangeToSYSMode(void); /* 任务切换到系统模式 */ __swi(0x81) void ChangeToUSRMode(void); /* 任务切换到用户模式 */ __swi(0x82) void TaskIsARM(INT8U prio); /* 任务代码是ARM代码 */ __swi(0x83) void TaskIsTHUMB(INT8U prio); /* 任务代码是THUMB */ #define OS_STK_GROWTH 1 /* 堆栈是从上往下长的 */ #define USR32Mode 0x10 /* 用户模式 */ #define SYS32Mode 0x1f /* 系统模式 */ #define NoInt 0x80 #ifndef USER_USING_MODE #define USER_USING_MODE USR32Mode /* 任务缺省模式 */ #endif #ifndef OS_SELF_EN #define OS_SELF_EN 0 /* 允许返回OS与任务分别编译、固化*/ #endif OS_CPU_EXT INT32U OsEnterSum; /* 关中断计数器(开关中断的信号量) */
由上面程序可知OS_CPU.h是有两部分组成:
1> 第一部分是定义于编译器无关的数据类型
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
typedef float FP32;
typedef double FP64;
typedef INT32U OS_STK;
之所以这样定义是因为:
μC/OS-II不使用C语言中的short、int、long等与处理器类型有关数据的类型,而代之以移植性很强的整数数据类型,这样既直观又便于移植,不过这就使这部分内容成了必须移植的代码
2>第二部分是关于ARM体系结构的
由于ARM7处理器核允许用户任务使用两种不同的处理器模式—用户模式和系统模式。当用户程序进入系统模式后,它就会具有使用系统全部资源的权利,而在用户模式中,为了安全,系统的某些底层资源是不应该也不允许应用程序访问的,那么UC/OS-II中的一些关键系统函数就应该保护起来,但是有时候用户程序还要使用系统的底层功能函数,此时该怎么办呢?
系统为了使应用程序在需要时可以由用户模式进入系统模式来调用UC/OS-II系统的底层功能函数,就采用了软中断的方法(swi)。
------------------------------------------------------------------
Tiger:
大家可以想想在linux中,又是如何实现的呢?
系统调用
------------------------------------------------------------------
在keil编译器中,允许用户使用关键字_swi作为前缀来声明一个利用软中断的调用(实质上就是一个系统调用),其格式如下:
_swi(功能号)返回值类型 名称(参数列表);
其中,功能号是指系统根据这个编号在软中断服务程序中来确定应执行的程序段。软中断SWI中断服务程序伪代码形式如下:
switch(功能号)
case 0:
功能号为0的系统功能函数代码;
break;
case 1:
功能号为1的系统功能函数代码;
break;
default:
··· ···
软中断各函数声明如下:
_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);
_swi(0x80) void ChangeToSYSMode(void);
_swi(0x81) void ChangeToUSRMode(void);
_swi(0x82) void TaskIsARM(INT8U prio);
_swi(0x83) void TaskIsTHUMB(INT8U prio);
3> OS_STK_GROWTH
虽然ARM处理器对堆栈向上及向下的两种增长方式都给予了支持,但由于编译器Keil uVision3仅支持堆栈从上往下长,并且必须是满递减堆栈,所以在此时用来定义堆栈增长方式的常量OS_STK_GROWTH的值应为1,即:
#define OS_STK_GROWTH 1
2. OS_CUP_C.C
----------------------------------------------------------未完待续-----------------------------