新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μC/OS-Ⅱ在MC9S12A64上的移植及应用

μC/OS-Ⅱ在MC9S12A64上的移植及应用

作者:时间:2012-05-17来源:网络收藏

自从嵌入式系统开发以来,很长时间都采用前后台系统软件设计模式:主程序为一个无限循环,单任务顺序执行。通过设置一个或多个中断来处理异步事件。这种系统对于简单的应用是可以的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。uCOS—II是一种给予优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使得实时应用程序的设计和扩展变得容易,使得应用程序的设计过程大为减化。而且它内核源代码公开,移植性强,为编程人员提供了很好的一个软件平台。

1 uCOS—II内核工作原理

1.1 基本工作原理

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。uCOS—II多任务操作系统工作原理:

(1)首先调用 OSInit()函数初始化处理器,操作系统,以及完成任务控制块(TCB)初始化,TCB优先级表初始化,TCB链表初始化,事件控制块(ECB)链表初始化,空任务的创建;

(2)然后创建新任务,每个任务都被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。

(3)最后调用OSSTART()函数开始多

1.2 实现方式

系统有两种触发方式:中断级的和任务级的。

(1)中断级的调度是系统多任务调度开始后,启动时钟节拍源开始计时,给系统提供周期性的时钟中断信号,实现延时和超时确认。当时钟节拍中断发生时,CPU由中断向量进入中断服务子程序,CPU会自动把当前内容的寄存器推入自己的堆栈,然后进行中断处理,中断处理完判断有无任务延时到期,若有则使该任务进入就绪态,并把所有进入就绪态的任务的优先级进行比较,通过中断级任务切换函数将最高优先级任务的状况从该任务的栈中装入CPU寄存器,执行该任务。若没有别的任务进入就绪态,则恢复现场继续执行原任务。

(2)任务级的调度是通过任务发软中断命令或依靠处理器在任务执行中调度函数OSSCHEDULE(),当多任务内核决定运行另外的任务时,例如任务要等待信号量或正在执行的任务被挂起时,就需要在此任务中调度,找出目前处于就绪态的优先级最高的任务去执行。它保存正在运行任务的当前状态,即CPU 寄存器中的全部内容。这些内容保存在任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。当没有任何任务进入就绪态时,就去执行空任务OSIDLE()。

1.3 共享资源的处理

可以被一个以上任务使用的资源叫做共享资源。

(1)可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数一般只使用局部变量,即变量保存在CPU寄存器中或每个任务自己的堆栈中。如果使用全局变量,则要把它视为不可重入型函数。所以可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。

(2)因为uCOS—II为可剥夺型内核,它总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占CPU,到中断服务完成时,内核让此时优先级最高的任务运行(不一定是当时被中断的任务),这时不可重入型函数中的数据有可能被破坏。所以应用程序不应直接使用不可重入型函数,在调用时,要满足互斥条件,这一点我们以前的处理方法是调用函数之前关中断,调用后再开中断,但是如果关中断的时间太长,会影响整个系统的中断响应时间。现在可以用互斥型信号量来实现。

(3)任务要运行下去先要得到信号,想要得到信号量的任务执行等待操作。如果该信号量有效(即信号量值大于0),则信号量值减1,任务得以继续运行。反之,则代表信号已被别的任务占用,等待信号量的任务就被挂起并列入等待信号量任务表。直到信号被当前使用者释放。

2 移植过程

2.1需要移植的文件

移植工作主要是对源文件的添加和改写,本文以在上的移植为例,分析μC/OS-II移植的一般方法。

(1)μC/OS-II与CPU类型无关的代码:μC/OS-II.H和μC/OS-II.C,其中μC/OS-II.C文件包含以下文件:OS_CORE.C OS_TASK.C OS_TIME.C OS_SEM.C OS_MBOX.C OS_MUTEX.C OS_FLAG.C也就是说这些文件可以直接添加不用修改。

(2)μC/OS-II与CPU类型有关的代码OS_CPU.H OS_CPU_A.ASM OS_CPUC.C。也就是说用户需要根据单片机的类型将这些函数修改后才能添加入内核。OS_CPU.H文件定义与编译器相关的数据类型,堆栈的宽度和增长方式以及开关中断的宏定义。由于我在移植时使用的是C交叉编译器,可以使OS_CPU_A.ASM和OS_CPUC.C两个文件合成为一个 OS_CPUC.C文件。

2.2 OS_CPU_C.C中主要函数的创建

2.2.1 时钟节拍中断服务子程序

void OSTickISR(void)

{

/* asm{

ldaa ppage //将每个任务的存储页面寄存器推入堆栈

psha

}*/

OSIntEnter(); //通知μC/OS-II进入时钟节拍中断服务子程序

OS_SAVE_SP();

CRGFLG =0xEF; //清中断标志

OSTimeTick(); //给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1

OSIntExit(); //通知μC/OS-II时钟节拍服务子程序结束。

/*asm{

pula

staa ppage //恢复页面寄存器

nop

rti //中断返回

}*/

}

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭