赞
踩
uC/OS-II操作系统移植
一.移植相关文件
μ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
先看下代码:
由上面程序可知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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。