软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > uC/OS-II在S3C44B0X微处理器上的移植
全文

uC/OS-II在S3C44B0X微处理器上的移植

2007-08-29 15:12作者:ChaseTang出处:论坛整理责任编辑:半仙

  设置includes.h中与处理器&编译器相关的代码

  

以下是引用片段:
#define INT8U unsigned char
  #define INT16U unsigned short
  #define INT32U unsighed long
  #define OS_STK unsigned long
  #define BOOLEAN int
  #define OS_CPU_SR unsighed long
  #define INT8S char
  extern int INTS_OFF(void);
  extern void INTS_ON(void);
  #define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF() }
  #define OS_EXIT_CRITICAL() { if(cpu_st == 0) INTS_ON(); }
  #define OS_STK_GROWTH 1
  #define STACKSIZE 256
  INTS_OFF
  mrs r0, cpsr ;当前CSR
  mov r1, r0 ;复制屏蔽
  orr r1, r1, #0xC0 ;屏蔽中断位
  msr CPSR, r1 ;关中断(IRQ and FIQ)
  and r0, r0, #0x80 ;从初始CSR返回FIQ位
  mov pc, lr ;返回
  INTS_ON
  mrs r0, cpsr ;当前CSR
  bic r0, r0, #0xC0 ;屏蔽中断
  msr CPSR, r0 ;开中断(IRQ and FIQ)
  mov pc, lr ;返回
  用C语言编写与OS相关的函数(OS_CPU_C.C)

  

以下是引用片段:
OSTaskStkInit——初始化任务堆栈
  OS_STK * OSTaskStkInit(void (*task) (void *pd), void *pdata, OS_STK *ptos,
  INT16U opt)
  {
  unsighed int *stk;
  stk = (unsighed int *)ptos; /*装载堆栈指针*/
  opt++;
  /*为新任务建立堆栈*/
  *--stk = (unsigned int) task; /*pc*/
  *--stk = (unsigned int) task; /*lr*/
  *--stk = 12; /*r12*/
  *--stk = 11; /*r11*/
  *--stk = 10; /*r10*/
  *--stk = 9; /*r9*/
  *--stk = 8; /*r8*/
  *--stk = 7; /*r7*/
  *--stk = 6; /*r6*/
  *--stk = 5; /*r5*/
  *--stk = 4; /*r4*/
  *--stk = 3; /*r3*/
  *--stk = 2; /*r2*/
  *--stk = 1; /*r1*/
  *--stk = (unsigned int) pdata; /*r0*/
  *--stk = (SUPMODE) /*cpsr*/
  *--stk = (SUPMODE) /*spsr*/
  return ((OS_STK *) stk);
  }
  void OSTaskCreateHook(OS_TCB *ptcb) 创建任务
  void OSTasdDelHook(OS_TCB *ptcb) 删除任务
  void OSTaskSwHook(void) 切换任务
  void OSTaskStatHook(void) 任务执行状态
  void OSTimeTickHook(void) 时钟节拍
  用汇编与处理器相关的函数(OS_CPU.ASM)

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

  

以下是引用片段:
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, r4
  LDMFD sp!, {r4} ;从栈顶获取新的状态
  MSR CPSR, r4 ;CPSR处于SVC32Mode模式
  LDMFD sp!, {r0-r12, 1r, pc} ;运行新的任务
  2.OS_TASK_SW( ); 任务级的任务切换函数

  

以下是引用片段:
OS_TASK_SW
  STMFD sp!, {pc} ;保存pc
  STMFD sp!, {1r} ;保存1r
  STMFD sp!, {r0-r12} ;保存寄存器&返回地址
  MRS r4, CPSR
  STMFD sp!, {r4} ;保存当前的的PSR
  MRS r4, SPSR
  STMFD sp!, {r4} ;保存SPSR
  ; OSRrioCur = OSPrioHighRdy
  LDR r4, addr_OSPrioCur
  LDR r5, addr_OSPrioHighRdy
  LDRB r6, [r5]
  STRB r6, [r4]
  ;得到当前任务地址
  LDR r4, addr_OSTCBCur
  LDR r5, [r4]
  STR sp, [r5] ;保存sp在被占先的任务的TCB
  ;得到最高优先级任务TCB地址
  LDR r6, addr_OSTCBHighRdy
  LDR r6, [r6]
  LDR sp, [r6] ;得到新任务堆栈地址
  ; OSTCBCur = OSTCBHighRdy
  STR r6, [r4]
  ;保存任务方式寄存器
  LDMFD sp!, {r4}
  MSR SPSR, r4
  LDMFD sp!, {r4}
  MSR CPSR, r4
  ;返回到新任务的上下文
  LDMFD sp!, {r0-r12, 1r, pc}
  3. OSIntCtxSw(); 中断级的任务切换函数

  

以下是引用片段:
OSIntCtxSw
  Add r7, sp, #16 ;保存寄存器指针
  LDR sp, =IRQStack ;FIQ_STACK
  mrs r1, SPSR ;得到暂停的SPR
  orr r1, r1, #0xC0 ;

软件资讯·软件下载尽在天极软件

相关搜索:
关注此文读者还看过
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众