·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
uC/OS-II在S3C44B0X微处理器上的移植
http://dev.21tx.com 2007年08月29日 论坛整理 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 ;

上一篇: 移动开发:第一次亲密接触移动数据库
下一篇: 嵌入式系统中文输入法的设计

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
晨新科技 版权所有 Created by TXSite.net