新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μCOSII在基于Cortex-M3核的ARM处理器上的移植

μCOSII在基于Cortex-M3核的ARM处理器上的移植

作者:时间:2009-03-27来源:网络收藏

BX r0;直接跳转到第一个任务的入口地址
第二个汇编语言函数OSCtxSw是任务级的任务切换函数。若在任务执行过程中有一个比当前任务优先级更高的任务进入就绪态,μCOS―II内核就会启动OSCtxSw进行任务切换。该函数会保存当前任务状态,然后恢复那个优先级更高的任务状态,使之投入运行。前述的宏定义#defineOS_TASK_SW()OS_SVC()中的OS_SVC()包含了SVC软件中断指令,此中断的中断向量应该设为函数OSCtxSw的入口地址,即OSCtxSw是SVC指令产生中断的中断服务程序,其源代码如下


由于微在进入中断时按堆栈增长方向自动顺序保存了如下8个寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,因此在程序中只须保存另外8个寄存器,保存顺序可以随意,但注意弹栈时要按照先进后出的方式进行。按照本文开头的假定,任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。而中断产生后,中断服务程序将处于处理模式下,并且默认使用的堆栈指针是MSP。因此在保存堆栈指针的时候需要保存的是当前任务的PSP。中断返回前新任务的堆栈指针需要恢复到PSP中。中断返回使用如下指令
MOVrO,#Oxfffffffd
BXr0
其中立即数#0xfffffffd包含了返回信息,用这两条指令可以使中断返回时使用任务堆栈指针PSP,返回后任务处于线程模式且使用任务堆栈指针PSP。
第三个汇编语言函数OSIntCtxSw与OSCtxSw类似。若任务执行过程中产生了中断,且中断服务程序使得一个比当前被中断的任务具有更高优先级的任务就绪时,μCOS―II内核就会在中断返回之前调用函数OSIntCtxSw。在此函数中不需要像任务级任务切换函数那样保存当前任务状态,因为当前任务已经被中断,在进入中断服务程序的时候任务状态已被保存。其源代码与函数OSctxSw中保存当前任务堆栈PSP指令以后部分相同,此处不再列出。
第4个汇编语言函数OSTickISR是系统时钟节拍的中断服务函数。STM32F103VBT6中有一个专用系统时钟节拍定时器SysTick,本过程使用此定时器产生每100 ms一次的时钟节拍中断。此函数源代码如下


3 程序开发模式讨论
传统应用程序开发模式称为超循环模式,即通常主程序是由C语言中的for语句或while语句构成的一个无限循环,程序在此循环中检测事件的发生,从而转向不同的任务。这种程序开发模式有两个主要的不足之处。首先从程序维护和可靠性的角度来看,所有任务都需要程序开发人员来进行全局性的维护,当系统变得庞大和复杂时,任务的维护会变得非常麻烦,同时程序的可靠性也受到影响。其次,从任务级响应时间来看,这个时间是不确定的,因为程序在循环体中检测事件发生的位置是固定的,但事件的发生是随机的,因此从事件发生到程序检测到事件发生这段时间也是不确定的。
操作系统的应用程序开发过程中,应用程序开发人员只需关心各个任务本身,而任务调度由操作系统代劳。以下的例子说明了μCOS―II操作系统的应用程序开发模式


其中函数SysInit的作用是根据具体应用对芯片进行必要的初始化,例如对系统的时钟分配以及通用输入输出端口配置。函数OSInit是μCOS―II操作系统的内核初始化程序。第一个OSTaskCreate函数创建了任务Taskl,此任务的入口地址是Taskl,优先级是0。第二个OSTaskCreate函数创建了任务Task2,此任务的入口地址是Task2,优先级是1。函数OSTaskCrate还会将其创建的任务置于就绪态。文献叙述了函数OSTa-skCreate的各个参数的含义。函数OSStart用于启动多任务调度。OSTimeDly是μCOS―II内核提供的系统调用函数,用于延时或定时,这里的参数5表示延时5个时钟节拍。应用程序开发人员需要做的就是通过调用μCOS―II内核提供的任务创建函数OSTaskCreate将编写好的任务程序交给操作系统管理。

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


评论


相关推荐

技术专区

关闭