dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>操作系统>文章内容
uC/OS-II在S3C44B0X微处理器上的移植
来源: 论坛整理 作者: 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 ;


上一篇:嵌入式系统中文输入法的设计   下一篇:C语言基础教程(五)函数
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·Linux常用基本命令及应用技巧
·进程和线程概念
·别浪费你的大内存 如何给Windows
·Vista系统下使用率最高的11条命
·写得蛮好的linux学习笔记
·学会在Linux下对硬盘分区
·找回Redhat的超级用户密码
·教你快速释放Windows系统资源的
·GDB教程
·Cron服务配置详解
·Linux与Unix二大操作系统编程的
·Linux 2.6 内核的嵌入式系统应用
  相关文章
·嵌入式系统中文输入法的设计
·使用J2ME程序测试MIDlet的生命周
·在J2ME手机程序开发中使用颜色
·Windows CE下驱动程序开发基础
·WM5.0模拟器用AS来使用PC机的网
·10年磨一剑 微软移动开发技术发
·Windows CE跨进程内存注入之实践
·Windows CE跨进程内存注入之原理
·linux内核初始化及启动之用户模
·linux内核初始化及启动之start_k
·嵌入式linux启动信息注释之bootl
·ARM的嵌入式Linux移植体验之应用
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763