新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 实时操作系统µC/OS-II在ARM7上的移植

实时操作系统µC/OS-II在ARM7上的移植

作者:时间:2012-04-10来源:网络收藏

(3)代码临界区

;在进入系统临界代码区之前需关中断,退出临界区后再开中断,则;能够保护临界区代码免受多任务或中断服务例程的破坏。在S3C44B0X中,通过设置状态寄存器CPSR中的中断禁止位来实现。;中的宏#define OS_ENTER_CRITICAL() IRQFIQDE定义将状态寄存器中的中断禁止位置位,以禁止所有的中断;#define OS_EXIT_CRITICAL() IRQFIQRE定义将状态寄存器的中断禁止位置零,以允许所有的中断。

(4) 定义OS_TASK_SW宏

OS_TASK_SW宏是µC/OS-II从低优先级任务切换到高优先级任务时的调度,可以采用下面两种方式定义:一种是如果处理器支持软中断,那么可以使用软中断将中断向量指向OSCtxSw函数;另一种是直接调用OSCtxSw函数。本文用的是后一种方式。

4.2 OS_CPU_A.ASM文件分析

(1) OSStartHighRdy()函数

OSStart()函数调用OSStartHighRdy(),使就绪态任务中优先级最高的任务开始执行。

其示意性代码如下:

Void OSStartHighRdy (void)
{
调用用户定义的OSTaskSwHook();
OSRunning=TRUE;
得到将要恢复运行任务堆栈指针;
SP=OSTCBHighRdy->OSTCBStkPtr;
从新任务堆栈中恢复处理器的所有寄存器;
执行中断返回指令;
}

(2) OSCtxSw函数

该函数由OS_TASK_SW宏调用。OS_TASK_SW宏由OSSched函数调用。OSSched函数负责任务之间的切换。OSCtxSw函数在OSSched函数中负责将当前任务对应的处理器寄存器保存到堆栈中,并将任务中需要恢复的处理器寄存器从堆栈中恢复出来。(3)OSIntCtxSw()函数

该函数由OSIntExit函数调用。OSIntExit函数由OSTickISR函数调用。OSIntCtxSW负责在定时中断任务之间的切换。目前提到的函数OSCtxSW和函数OSIntCtxSW均负责任务之间的切换,区别主要在于是否在定时中断期间负责任务切换。OSIntCtxSW函数主要当前任务堆栈指针,并将新任务对应的处理器寄存器从堆栈中恢复出来。

(4)OSTickISR()函数

时间节拍函数,由定时中断产生。主要负责在进入时保存处理器寄存器,完成任务时切换,推出时恢复寄存器并返回。OSTickISR()函数完成的操作和OSCtxSw()类似,只不过OSTickISR()是由硬件定时器溢出中断触发。其示意性代码如下:

Void OSTickISR (void)
{
保存处理器寄存器;
调用OSIntEnter()或者直接给OSIntNesting加1;
if(OSIntNesting==1){
OSTCBCur->OSTCBStkPtr=SP;
给产生中断的设备清中断;}
OSTimeTick();OSIntExit();
恢复处理器寄存器;执行中断返回;
}

4.3 OS_CPU_C.C 文件分析

这个源文件中有6个函数需要,即OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、 OATaskSwHook()、OSTaskStatHook()和OSTASKTickHook()。后面5个函数又称为钩子函数,主要用来扩展µC/OS-II功能。但必须声明,并不一定要包含任何代码。唯一必须的函数是OSTaskStkInit()。该函数在任务创建时被调用,它负责初始化任务的堆栈结构。这个函数在大部分ARM处理器中时都可以采用一种形式。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭