μC/OS II针对TMS320C32的移植 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
μ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){} /*时钟节拍创建扩展外挂函数*/ |
|
|
|
|
|