首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UC OS ARM移植(1)

UC OS ARM移植(1)

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);
}
返回列表