uCOS-II在ARM上的移植_第1页
uCOS-II在ARM上的移植_第2页
uCOS-II在ARM上的移植_第3页
uCOS-II在ARM上的移植_第4页
uCOS-II在ARM上的移植_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、uCOS-II在ARM上的移植 uCOS-II在ARM上的移植详细方法:移植工作介绍实际上uC/OS-II可以简单地看作 是一个多任务调度器,在这个任务调度器上完善地添加了与多任务操作系统相关的一些系统服务,如信号量、邮箱等。其90%的代码是用C语言写的,可以直接移 植到有C语言编译器的处理器上。移植工作主要都集中在多任务切换的实现上,因为这部分代码用来保存和恢复CPU现场(即写/读相关寄存器),不能用C语 言,只能使用汇编语言完成。uC/OS-II的全部源代码量大约是60007000行,共15个文件。将 uC/OS-II 移植到ARM处理器上,需要修改三个与ARM体系结构相关的文件,代码量大

2、约是500行。以下分别介绍这三个文件的移植工作。OS_CPU.H                 OS_CPU_A.ASM              OS_CPU_C.COS_CPU.H 文件图1 ARM体系结构的寄存器位置·1-数据类型定义数据类型的修改与所用的编译器相关,不同的编译器使用不同的字

3、节长度表示同一数据类型,比如int,同样在x86平台上,GNU的gcc编译为4 bytes,而MS VC则编译为2 bytes。·2-堆栈单位在任务切换时,CPU现场的寄存器将保存在当前运行任务的堆栈中,所以OS_STK 数据类型应该与CPU的寄存器长度一致。typedef unsigned int os STK;typedef unsigned char BOOLEAN;                 /* 布尔变量

4、60;                                */typedef unsigned char INT8U;             &#

5、160;     /* 无符号8位整型变量                        */typedef signed   char INT8S;             &#

6、160;     /* 有符号8位整型变量                        */typedef unsigned short INT16U;              

7、0;   /* 无符号16位整型变量                       */typedef signed   short INT16S;                &

8、#160; /* 有符号16位整型变量                       */typedef unsigned int   INT32U;                  /*

9、无符号32位整型变量                       */typedef signed   int   INT32S;                  /*

10、 有符号32位整型变量                       */typedef float          FP32;             

11、60;      /* 单精度浮点数(32位长度)                 */typedef double         FP64;              

12、;      /* 双精度浮点数(64位长度)                 */typedef INT32U   OS_STK;                    

13、;     /* 堆栈是32位宽度                           */#define BYTE           INT8S#define UBYTE &#

14、160;        INT8U#define WORD           INT16S#define UWORD          INT16U#define LONG           INT32S#define ULONG

15、60;         INT32U·3-堆栈增长方向void OS_TASK_SW(void;              /* 任务级任务切换函数          */void OSStartHighRdy(void;     

16、0;    /* 运行优先级最高的任务        */void OS_ENTER_CRITICAL(void;       /* 关中断                      */void OS_EXIT_CRITICAL

17、(void;        /* 开中断                      */#define OS_STK_GROWTH    1            

18、60;         /* 堆栈是从上往下长的          */#define     USR32Mode       0x10                /* 用户模

19、式                    */#define     SYS32Mode       0x1f                /* 系统模式&#

20、160;                   */#define     NoInt           0x80#ifndef USER_USING_MODE#define USER_USING_MODE SYS32Mode    

21、60;          /* 任务缺省模式                 */#endif#ifndef OS_SELF_EN#define OS_SELF_EN     0           

22、             /* 允许返回OS与任务分别编译、固化*/    #endifOS_CPU_A用汇编编写任务开始函数OSStartHighRdy   MSR   CPSR_c,#(NoInt | SYS32Mode      LDR   R1,=OSRunning   MOV   R2,#

23、1   STRB R2,R1          ;OSRunning=1     BL   OSTaskSwHook        ;调用OSTaskSwHook(     B   _OSStartHighRdy       ;运行最高优先

24、级任务任务切换函数OS_TASK_SW   STMFD SP!,LR          ;保存当前任务的PC   STMFD SP!,R0-R12,LR        ;依次保存R0-R12、LR   MRS   R0,CPSR   STMFD SP!,R0       

25、0; ;保存CPSR     LDR   R1,=OSTCBCur   LDR   R1,R1   STR   SP,R1          ;OSTCBCur->OSTCBStkPtr = SP(在当前任务控制块中保存当前任务的堆栈指针          

26、60;         BL   OSTaskSwHook        ;调用OSTaskSwHook(          LDR   R3,=OSPrioCur        LDR   R4,=OSPrioHighRdy&#

27、160;       LDRB R4,R4        STRB R4,R3          ;OSPrioCur=OSPrioHighRdy中断任务切换函数OSIntCtxSw   BL   OSTaskSwHook        ;调用钩子函数OSTaskSwH

28、ook(               MSR     CPSR_c, #(NoInt | IRQ32Mode       LDR     R0, =OSTCBHighRdy        LDR     R0,

29、 R0        LDR     R1, =OSTCBCur        STR   R0, R1         ;OSTCBCur=OSTCBHighRdy             

30、;   LDR   R0,=OSPrioCur        LDR   R1,=OSPrioHighRdy        LDRB R1,R1        STRB R1,R0          ;OSPrioCur=OSPrioHig

31、hRdy               LDR   R0,=IRQStack   LDR   R0,R0   SUB   R0,R0,#4         ;   MOV   SP,R0    

32、0;     ;IRQ模式堆栈保留一个字     MSR     CPSR_c, #(NoInt | SYS32Mode    ;进入系统模式   LDR     R2, =OSTCBHighRdy        LDR     R2, R2   &

33、#160;            LDR   R2, R2         ;取得新任务堆栈指针OSTCBHighRdy->OSTCBStkPtr并存入R2中               LDR   R1,R2 &

34、#160;        ;取得新任务的CPSR存入R1中        LDR   R3,R2,#15*4        ;取得新任务的PC存入R3中        STR   R3,R0       

35、60;  ;把新任务的PC存入IRQ模式的堆栈中                MSR     CPSR_c, #(NoInt | IRQ32Mode    ;进入IRQ模式        MSR   SPSR_cxsf,R1    

36、60;   ;把新任务的CPSR保存到IRQ模式的SPSR中                MSR     CPSR_c, #(NoInt | SYS32Mode    ;进入系统模式              

37、0;              ADD   R2,R2,#4         ;调整新任务堆栈指针      MOV   SP,R2          ;    

38、0;   系统模式SP|R0 |      LDMFD SP!,R0-R12,LR        ;恢复新任务的R0-R12,LR, 系统模式SP|PC |          ADD   SP,SP,#4         ;调整系统模式堆栈指针  &

39、#160;         MSR     CPSR_c, #(NoInt | IRQ32Mode    ;进入IRQ模式      LDMFD SP!,PC         ;恢复新任务的CPSR、PC和IRQ模式SP中断禁止和允许函数OS_ENTER_CRITICAL   STMFD SP!,R

40、0   MRS   R0,CPSR   ORR   R0,R0,#NoInt   MSR   CPSR_cxsf,R0   LDMFD SP!,R0   MOV   PC,LROS_EXIT_CRITICAL   STMFD SP!,R0   MRS   R0,CPSR   BIC   R0,R0,#NoInt

41、0;  MSR   CPSR_cxsf,R0   LDMFD SP!,R0   MOV   PC,LR节拍中断函数OS_CPU_C.C 文件·1-任务堆栈初始化在 此讨论任务初始化时的堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器位置。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、 lr、r12、r11、r10、. r1、r0、CPSR、SPSR,有两点需要说明:一是,当前任务堆栈初始化完成后,OSTaskStkInit 返回新的堆栈指针STK,在 OSTas

42、kCreate()执行时,将会调用 OSTaskStkInit 的初始化过程,然后通过OSTCBInit()函数调用,将返回的SP指针保存到该任务的TCB块中。二是,初始状态的堆栈是模拟了一次中断后的堆栈结 构,因为任务创建后并不是直接就获得执行,而是通过OSSched()函数进行调度分配,满足执行条件后才能获得执行。为了使这个调度简单一致,就预先将 该任务的PC指针和返回地址LR都指向函数入口,以便被调度时从堆栈中恢复刚开始运行时的CPU现场。·2-系统钩子函数(6个c函数)在该文件中需要实现几个操作系统规定的hook函数,如下:OSSTaskCreateHook( OSTaskD

43、elHook( OSTaskSwHook( OSTaskStatHook( OSTimeTickHook( 若无特殊需求,只需简单地将它们都实现为空函数即可。任务堆栈初始化        OS_STK *OSTaskStkInit (void (*task(void *pd, void *pdata, OS_STK *ptos, INT16U opt    OS_STK *stk;    opt    = opt;  

44、;                         /* 'opt' 没有使用。作用是避免编译器警告    */    stk    = ptos;         

45、;                 /* 获取堆栈指针                             */   

46、0;                                        /* 建立任务环境,ADS1.2使用满递减堆栈       */&

47、#160;   *-stk = (OS_STK task;                   /* pc */    *-stk = (OS_STK task;                 /* lr *

48、/    *-stk = 0;                             /* r12 */    *-stk = 0;          

49、60;                  /* r11 */    *-stk = 0;                          

50、   /* r10 */    *-stk = 0;                             /* r9   */    *-stk = 0;     &

51、#160;                       /* r8   */    *-stk = 0;                   

52、;          /* r7   */    *-stk = 0;                             /* r6   */ 

53、   *-stk = 0;                             /* r5   */    *-stk = 0;                             /* r4   */    *-stk = 0;             

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论