移植UCOS到JZ2440

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36195711/article/details/88252798

不使用集成编译器,所有的编译想在linux环境下完成

首先获取ucos源码,进行常规的修改,即移植主要涉及的文件

1.设置与处理器相关的代码 OS_CPU.H

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

typedef INT32U   		OS_CPU_SR;

ucos需要先关中断再访问临界区的代码,并在访问完成后重新允许中断,ucos定义了两个宏来禁止和允许中断,这两个宏需要我们自己来实现

#define  OS_ENTER_CRITICAL()  (cpu_sr = OSCPUSaveSR())  /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   (OSCPURestoreSR(cpu_sr))  /* Restore  interrupts                       */

声明这两个函数

OS_CPU_SR  OSCPUSaveSR(void);
void       OSCPURestoreSR(OS_CPU_SR cpu_sr);

在OS_CPU_A.S中来实现

        .global  OSCPUSaveSR
OSCPUSaveSR:

        mrs r0,CPSR
        orr r1,r0,#0xc0
        msr CPSR_c,r1
        bx lr


        .global  OSCPURestoreSR
OSCPURestoreSR:

        msr CPSR_c,r0
        bx lr

2.用C语言实现与处理器任务相关的函数,在OS_CPU_C.C中实现,主要是实现一个系统的堆栈初始化函数

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;


    opt    = opt;                           /* 'opt' is not used, prevent warning                      */
    stk    = ptos;                          /* Load stack pointer                                      */
    *(stk) = (OS_STK)task;                  /* Entry Point                                             */
    *(--stk) = (INT32U)0;                   /* lr                                                      */
    *(--stk) = (INT32U)0;                   /* r12                                                     */
    *(--stk) = (INT32U)0;                   /* r11                                                     */
    *(--stk) = (INT32U)0;                   /* r10                                                     */
    *(--stk) = (INT32U)0;                   /* r9                                                      */
    *(--stk) = (INT32U)0;                   /* r8                                                      */
    *(--stk) = (INT32U)0;                   /* r7                                                      */
    *(--stk) = (INT32U)0;                   /* r6                                                      */
    *(--stk) = (INT32U)0;                   /* r5                                                      */
    *(--stk) = (INT32U)0;                   /* r4                                                      */
    *(--stk) = (INT32U)0;                   /* r3                                                      */
    *(--stk) = (INT32U)0;                   /* r2                                                      */
    *(--stk) = (INT32U)0;                   /* r1                                                      */
    *(--stk) = (INT32U)pdata;               /* r0 : argument                                           */
#ifdef THUMB_TASKS
    *(--stk) = (INT32U)(SVCMODE|TBIT);      /* PSR                                                     */
#else
    *(--stk) = (INT32U)(SVCMODE|0x0);       /* PSR                                                     */
#endif
    *(--stk) = (INT32U)(SVCMODE|0x0);       /* SPSR                                                    */

        return (stk);
}

和一些钩子函数,如果用不到的话,可以定义成空函数

3.处理器相关部分的汇编实现,需要编写的函数如下

OSStartHighRdy()
OSCtxSw()
OSTickISR()

具体的汇编代码就不贴了,以后拿出来研究

猜你喜欢

转载自blog.csdn.net/qq_36195711/article/details/88252798
今日推荐