UCOS-II的移植需要提供2,3个文件分别介绍如下: 一:OS_CPU.H 1 与编译器有关的数据类型 经典的全局变量定义,可以套用,简洁明了实用性好。 #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif 只是按照不同的编译器编写对应的数据类型的typedef 对应于ARM7的数据类型的编写如下 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位长度) */
在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32U typedef INT32U OS_STK; /* 堆栈是32位宽度 */
2 与处理器相关的代码 先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #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 */ 定义堆栈的生长方式,ARM7内核支持两种生长方式,但是ADS的C语言编译器只支持从上往下的生长方式,因此: #define OS_STK_GROWTH 1 /* 堆栈是从上往下长的,0-从下往上的生长方式 */
最后几行分别定义了用户模式01和系统模式1f以及IRQ中断禁止的指令80三个立即数,方便调用。 #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.C文件
头文件的引用:
#define OS_CPU_GLOBALS
#include "config.h"
/*********************************************************************************************************
** 函数名称: OSTaskStkInit
** 功能描述: 任务堆栈初始化代码,本函数调用失败会使系统崩溃
** 输 入: task : 任务开始执行的地址
** pdata :传递给任务的参数
** ptos :任务的堆栈开始位置
** opt :附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数
** 输 出: 栈顶指针位置
** 全局变量:
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年6月13日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' 没有使用。作用是避免编译器警告 */
stk = ptos; /* 获取堆栈指针 */
/* 建立任务环境,ADS1.2使用满递减堆栈 */
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
*--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
*--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
*--stk = 0; /* 关中断计数器OsEnterSum; */
return (stk);
} |