当前位置:首页>> μCOS-II 在ARM处理器上的移植要点

μCOS-II 在ARM处理器上的移植要点

发布时间:2011-11-26作者:智汇小新

  1. 设置OS_CPU.H 中与处理器和编译器相关的代码

  /********************************************************************

  *

  * 与编译器相关的数据类型

  *********************************************************************

  /

  typedef unsigned char BOOLEAN;

  typedef unsigned char INT8U; //8 位无符号整数

  typedef signed char INT8S; //8 位有符号整数

  typedef unsigned int INT16U; //16 位无符号整数

  typedef signed int INT16S; //16 位有符号整数

  typedef unsigned long INT32U; //32 位无符号整数

  typedef signed long INT32S; //32 位有符号整数

  typedef float FP32; //单精度浮点数

  typedef double FP64; //双精度浮点数

  typedef unsigned int OS_STK; //堆栈入口宽度为16 位

  #define BYTE INT8S //字节型

  #define UBYTE INT8U //为了与uC/OS V1.xx.兼容

  #define WORD INT16S // 。.. uC/OS-II.

  #define UWORD INT16U

  #define LONG INT32S

  #define ULONG INT32U

  /********************************************************************

  * 与ARM 处理器相关的代码

  ********************************************************************/

  #define OS_ENTER_CRITICAL() ARMDisableInt() /*关闭中断*/

  #define OS_EXIT_CRITICAL() ARMEnableInt() /*开启中断*/

  /* 设施堆栈的增长方向*/

  #define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/

  2. 用C 语言编写六个操作系统相关的函数(OS_CPU_C.C)

  void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt)

  {

  unsigned int *stk;

  opt = opt; /* 因为‘opt’ 变量没有用到,防止编译器产生警告*/

  stk = (unsigned int *)ptos; /*装载堆栈指针*/

  /* 为新任务创建上下文*/

  *--stk = (unsigned int) task; /* pc */

  *--stk = (unsigned int) 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 */

  *--stk = (SVC32MODE|0x0); /* cpsr IRQ, 关闭FIQ */

  *--stk = (SVC32MODE|0x0); /* spsr IRQ, 关闭FIQ */

  return ((void *)stk);

  }

  void OSTaskCreateHook (OS_TCB *ptcb)

  {

  ptcb=ptcb;//防止编译时出现警告

  }

  void OSTaskDelHook (OS_TCB *ptcb)

  {

  ptcb=ptcb;//防止编译时出现警告

  }

 

  void OSTaskSwHook (void)

  void OSTaskStatHook (void)

  void OSTimeTickHook (void)

  后5 个函数为钩子函数,可以不加代码。

  3. 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM)

  (1)OSStartHighRdy();运行优先级最高的就绪任务

  LDR r4, addr_OSTCBCur ; 得到当前任务的TCB 地址

  LDR r5, addr_OSTCBHighRdy ; 得到高优先级任务的TCB 地址

  LDR r5, [r5] ;得到堆栈指针

  LDR sp, [r5] ;切换到新的堆栈

  STR r5, [r4] ; 设置新的当前任务的TCB 地址

  LDMFD sp!, {r4}

  MSR SPSR_cxsf, r4

  LDMFD sp!, {r4} ; 从栈顶得到新的声明

  MSR CPSR_cxsf, r4

  LDMFD sp!, {r0-r12, lr, pc } ; 开始新的任务

  END

  (2)OSCtxSw();任务级的任务切换函数

  STMFD sp!, {lr} ; 保存PC 指针

  STMFD sp!, {lr} ; 保存lr 指针

  STMFD sp!, {r0-r12} ;保存寄存器文件和ret 地址

  MRS r4, CPSR

  STMFD sp!, {r4} ; 保存当前PSR

  MRS r4, SPSR

  STMFD sp!, {r4}

  ; OSPrioCur = OSPrioHighRdy

  LDR r4, addr_OSPrioCur

  LDR r5, addr_OSPrioHighRdy

  LDRB r6, [r5]

  STRB r6, [r4]

  ; 得到当前任务的TCB 地址

  LDR r4, addr_OSTCBCur

  LDR r5, [r4]

  STR sp, [r5] ; 保存栈指针在占先任务的TCB 上

  ; 取得高优先级任务的TCB 地址

  LDR r6, addr_OSTCBHighRdy

  LDR r6, [r6]

  LDR sp, [r6] ;得到新任务的堆栈指针

  ; OSTCBCur = OSTCBHighRdy

  STR r6, [r4] ; 设置当前新任务的TCB 地址set new current task TCB

  address

  LDMFD sp!, {r4}

  MSR SPSR_cxsf, r4

  LDMFD sp!, {r4}

  MSR CPSR_cxsf, r4

  LDMFD sp!, {r0-r12, lr, pc}

  (3)OSIntCtxSw();中断级的任务切换函数

  LDMIA sp!,{a1-v1, lr}

  SUBS pc, lr, #4

  SUB lr, lr, #4

  MOV r12, lr

  MRS lr, SPSR

  AND lr, lr, #0xFFFFFFE0

  ORR lr, lr, #0xD3

  MSR CPSR_cxsf, lr

  (4)OSTickISR();中断服务函数

  STMDB sp!,{r0-r11,lr}

  ;interrupt disable(not nessary)

  mrs r0, CPSR

  orr r0, r0, #0x80 ; 设置中断禁止标

  msr CPSR_cxsf, r0 ;中断结束

  ; rI_ISPC= BIT_TIMER0;

  LDR r0, =I_ISPC

  LDR r1, =BIT_TIMER0

  STR r1, [r0]

  BL IrqStart

  BL OSTimeTick

  BL IrqFinish

  LDR r0, =need_to_swap_context

  LDR r2, [r0]

  CMP r2, #1

  LDREQ pc, =_CON_SW

  完成了上述工作以后,μCOS-II 就可以正常运行在ARM 处理器上了。

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1