新闻中心

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

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

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

当时钟节拍中断发生时,CPU12会自动把CPU寄存器推入堆栈,但并不包括存储页面寄存器PPAGE,如果单片机系统的寻址范围超过64KB,需要通过给PPAGE赋值来区分不同的16KB地址,则需要把PPAGE也推入堆栈。OSTimtick()当某任务的任务控制块中的时间延时项 OSTCBDly减到了零,这个任务就进入了就绪态。OSIntExit()会调用中断级的任务切换函数OSIntCtxSw()做任务切换,而不再执行后面的指令。如果没有更高优先级的任务进入就绪态,则CPU会返回中断前状态。

2.2.2 任务级任务切换

OSCtxSW()实际上就是软中断服务子程序,软中断服务子程序向量地址必须指向OSCtxSW(),在连接文件中设置。如果当前任务调用µC/OS-Ⅱ提供的系统服务,并使得更高优先级任务处于就绪状态,µC/OS-Ⅱ就会借助上面提到的向量地址找到OSCtxSw()。

void OSCtxSw(void)

{

asm{

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

psha

ldx OSTCBCur // 保存被挂起任务的堆栈指针到任务控制块

sts 0,x

}

OSTaskSwHook(); // 如果有时间要求苛刻的任务,可以通过用户接口函数调用

OSTCBCur = OSTCBHighRdy; // 将优先级最高的就绪态任务的任务控制块指针复制给当前运行的任务控制块中

OSPrioCur = OSPrioHighRdy;

asm{

ldx OSTCBCur // 找出新任务的堆栈指针

lds 0,x // 装入CPU的SP寄存器中

pula

staa ppage //恢复页面寄存器

nop

rti

}

}

2.3 信号量的建立与使用

(1)首先到μC/OS-II配置文件OS_CFG.C中将OS_SEM_EN设置为1这样µC/OS-II才能支持信号量。接着要调用OSSemCreate()函数建立该信号量,如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1。

(2)等待信号量OSSemPend()函数,它首先检查指针pevent所指的任务控制块是否是由OSSemCreate()。如果信号量当前是可用的,将信号量的计数值减1,然后函数将“无错”错误代码返回给它的调用函数。如果信号量的计数值为0,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务发出该信号量。OSSemPend()允许用户定义一个最长等待时间作为它的参数,这样可以避免该任务无休止地等待下去。如果该参数值为0,则该任务将一直等待下去。



评论


相关推荐

技术专区

关闭