首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

uCOS II在ARM移植过程中的中断处理 02

uCOS II在ARM移植过程中的中断处理 02

  这里设置了标准中断异常(IRQ)和快速中断异常(FIQ)的中断入口,其余异常都设置为死循环,当发生这些异常的时候,必须使系统复位才能退出死循环。


  3.2 移植中断任务切换


  中断任务切换(OSIntCtxSw)和任务切换函数(OSCtxSw)比较相似,主要有以下几步组成:


  1)调用OSTask SwHook()


  2)OSPrioCur=OSPrioHighRdy


  3)OSTCBCur=OSTCBHighRdy


  4)SP=OSTCBHighRdy->OSTCBStkPtr


  //获取高优先级的任务堆栈指针


  5)从高优先级的任务的堆栈中弹出高优先级的任务上下文


  6)执行高优先级的任务


  3.3 移植中断服务程序


  以IRQ中断为例中断服务程序(OS_CPU_IRQ_ISR)主要依据上面所描述的“uCOS II中断响应的过程”编写,其主要代码如下:


  ……


  LDR R0,OS_IntNesting


  LDRB R1,[R0]


  ADD R1,R1,#1


  STRB R1,[R0]


  CMP R1,#l


  BNE OS_CPU_IRQ_ISR_1


  LDR R4,OS_TCBCur


  LDR R5,[R4]


  STR SP,[R5]


  OS_CPU_IRQ_ISR_1:


  MSR CPSR_c,#(NO_INT | IRQ32_MODE)


  //切换到SVC模式


  LDR R0,OS_CPU_IRQ_ISR_Handler


  MOV LR,PC


  BX R0


  MSR CPSR_c,#(NO_INT | SVC32_MODE)


  //切换到SVC模式


  LDRR0,OS_IntExit //OSIntExit()


  MOV LR,PC


  BX R0


  ……


  在代码中省略了现场工作寄存器的保护与恢复及工作模式的切换。
返回列表