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

μC/OS II针对TMS320C32的移植 02

μC/OS II针对TMS320C32的移植 02

代码的临界区
  mC/OS-II在进入系统临界代码区之前要关中断,避免临界区代码受多任务或中断服务程序的破坏,等到临界区代码执行完毕之后,该怎么处理呢?有两种方案可以供选择:1)不管关中断前中断使能情况是什么样子,一律开中断;2)恢复关中断前中断使能情况,从一定程度上保证任务执行环境的完整性。
  C32中,状态寄存器ST的第13位是全局中断使能位GIE把该位置0,那么不管什么中断都不去被响应,直到临界区代码执行完毕为止。(注:C32没有不可屏蔽的中断NMI,对于别的芯片来说,如果有NMI的话,处理办法就是在这个中断服务程序ISR中对ST中的GIE位进行判断,如果置0,那么这个ISR简单响应一下这个中断,大部分处理工作放到GIE置1后马上去执行)。宏OS_ENTER_CRITICAL()把GIE位置0而关闭所有中断。
  堆栈增长方向
  C32处理器的堆栈是由低地址向高地址递增,所以OS_STK_GROWTH应该设置为1;
  进入任务切换函数OS_TASK_SW()的定义
  mC/OS-II中,进入任务切换是用函数OS_TASK_SW()来实现的。这个函数通过软中断模拟了一次中断过程,在这个中断服务程序ISR中实现任务的切换,切换的具体实现在介绍任务切换函数OSCtxSw()时详细阐述。C32共有28个软中断可供使用,通过执行汇编指令 TRAP 0、TRAP 1……TRAP27来产生软中断,也称为TRAP陷阱调用。这里,我们选择编号为27的软中断作为进入任务切换的中断:
  #define  OS_TASK_SW()    asm("TRAP 27")
  还要注意的一点是这个中断服务程序的入口必须指向函数OSCtxSw()。
  INCLUDES.H文件
  INCLUDES.H是主要的头文件,在大多数.C文件的开始都包含INCLUDES.H文件。不同处理器、不同编译器、不同库文件,需要修改INCLUDES.H文件,删除不使用的头文件,添加自己的头文件。而且,头文件之间有包含关系、条件编译的,一定要排好他们之间的先后顺序。,INCLUDES.H文件修改如下:
  #ifndef __INCLUDES_H__
  #define __INCLUDES_H__
  #include    "OS_CFG.H"
  #include    "OS_CPU.H"
  #include    "mCOS_II.H"
  #include    "C32.H"
  #endif
  其中C32.H文件包含了4个头文件:
  #include "Timerdef.H"
  #include "SerialPort.H"
  #include "Dma.H"
  #include "Bus.H"
  分别对C32的定时器、串口、DMA通道、总线编程用到的数据结构进行定义。
  OS_CPU_C32.ASM文件
  本来,这个汇编文件里面要实现4个函数:多任务启动函数中调用的OSStartHighRdy()、中断任务切换函数OSIntCtxSw()、任务切换函数OSCtxSw()、时钟节拍服务函数OSTickISR();但是这里只实现后两个函数。前两个函数在OS_CPU_C32.C中实现。
  任务切换函数:OSCtxSw()
  该函数由任务切换函数OS_TASK_SW()进入,与中断程序中调用的OSIntCtxSw()不同。mC/OS-II中,如果任务执行了某个函数,其结果改变了当前任务的状态(如OSTaskSuspend()、OSTimeDly())、或者是改变了别的任务的状态(OSTaskResume()、OSTimeDlyResume())都要引起新的任务调度:OSSched();在任务调度函数找出新任务将其控制块地址放到OSTCBHigRdy后,执行OS_TASK_SW()。任务切换流程:1)硬件进入中断处理:全局中断使能位置0、返回地址压栈。2)寄存器值压入当前任务堆栈;3)修改当前任务控制块指针OSTCBCur和当前任务优先级OSPrioCur;4)恢复任务堆栈中的值到寄存器中;5)执行当前任务,由RETI指令完成。
  时钟节拍函数:OSTickISR()
  mC/OS-II中,时钟节拍中断是一个非常重要的中断,因为整个操作系统的活动都受到它的激励。
  OSTickISR()的执行流程:1)硬件进入中断处理,同上;2)保护上下文环境;3)调用OSIntEnter(),记录中断嵌套层数;4)调用OSTimeTick(),检查处理各个任务的延时,并根据情况修改就绪任务表;5)调用OSIntExit(),检查就绪任务表,看是否有比当前任务优先级更高的任务就绪,如果有,则进行调度;如果没有,OSIntExit()返回并恢复2)所保存的上下文环境,并执行RETI回到被中断的那个任务里继续运行;如果有,那么OSIntExit()就不返回到这里,具体的情况后面介绍OSIntExit()时具体阐述。
  OS_CPU_C32.C文件
  这个文件里,主要实现3个函数:堆栈初始化函数OSTaskInit()、中断任务切换函数OSIntCtxSw()、多任务启动函数中调用的OSStartHighRdy(),另外还有5个扩展外挂函数:
  void    OSTaskCreateHook(OS_TCB ptcb){} /*任务创建扩展外挂函数*/
  void    OSTaskSwHook(void){} /*任务切换扩展外挂函数*/
  void    OSTaskDelHook(OS_TCB *ptcb){}  /*任务删除扩展外挂函数*/
  void    OSTaskStatHook(void){} /*统计任务扩展外挂函数*/
  void    OSTimeTickHook(void){}  /*时钟节拍创建扩展外挂函数*/
返回列表