1. 不依赖于编译的数据类型
uC/OS-II不使用C语言中的short,int和long等数据类型的定义,因为他们与处理的类型有关,隐含着不可移植性。代之以移植性强的整数数据类型,这样既直观又可移植。
不依赖于编译器的数据类型
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
2. 使用软中断SWI做底层接口
为了是底层接口函数与处理器状态无关,同时在任务调用相应的函数不需要知道函数位置,本移植使用软中断指令SWI作为底层接口,使用不同的功能号区分不同的函数。
ADS关键字__swi,用它声明一个不存在的函数,则调用这个函数就在调用这个函数的地方插入一条SWI(ARM指令)指令,并且可以指定功能号。通过__SWI指令声明的函数当程序调用时会跳转到SoferwareInterrupt软件中断的汇编接口。
注:SWI指令用于产生软中断,从而实现从用户模式转变到管理模式。
SWI服务函数
__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); /* 任务代码是ARM代码 */
__swi(0x83) void TaskIsTHUMB(INT8U prio); /* 任务代码是THUMB */
3. OS_STK_GROWTH指定堆栈的生长方向
为0,表示堆栈从下往上长;
为1,表示堆栈从上往下长
ARM处理器核对两种方式均支持。ADS的C语言编译器,只支持从上往下长。