新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 实时操作系统μC/OS-Ⅱ在单片机上的移植

实时操作系统μC/OS-Ⅱ在单片机上的移植

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

4移植的细节

在 OSTaskStkInit()中,任务堆栈区的构造特点是的堆栈区由高向低增长,最高处是任务的入口参数,接着是PC指针和程序状态字。如前所述,任务切换时要对临时寄存器和框架寄存器进行保护。明确了任务堆栈的构造后,编写任务启动函数(指OSStaart函数)和任务切换函数(指 OS_TAASK_SW和OSIntCtxSw 函数)的关键是,在得到了最高优先级的任务堆栈指针后,如何按正确的顺序出栈,直到PC针。其中OS_TASK_SW()函数在切换任务之前还要编写对当前任务的现场进行保护的程序,而OSIntCtxSw()不用,因为中断函数用C写成,而OSIntCtxSw()是在中断中调用的,因此, 编译器在进中断时已自动对其保护。同时还应注意,由于在中断服务程序中没有定义局部变量,这使得Tasking C编译器不能对框架寄存器进行保护,因此,对这一寄存器的保护应在设计时自己加上。

  还应注意,在其它中断服务程序中,如果没有定义局部变量,也应加上对框架寄存器的保护。如果有局部变量,编译器会自动对框架寄存器进行保护。在编写 OSIntCtxSw()函数时应当注意,由于OS-IntCtxSw()是在OSIntExit()中调用的,且在调用OS-IntCtxSw()之前又有一个关中断的操作。因此,笔者采用push a方式来关闭中断,也就是说,切换到另一高优先级的任务后,会在当前任务中留下在OSIntC-txSw()和OSIntExit()调用的返回地址4个字节的垃圾和pusha关中断时进栈的4个字节垃圾(共8个字节)。因此,为了保证下次切换到该任务的正确性,应将SP指针加8,然后再进行任务切换。为加深对此的理解,可以做一假设:如果是24位(3个字节)寻址能力,在当前任务中会留下OSIntCtxSw()和OSIntExit()调用的返回地址的6个字节的垃圾,如果关中断直接采用asmdi方式,而不牵扯到堆栈操作,此时SP应调整6个字节而不是8个字节。

5正确性检验

图3是一个点灯程序的主任务流程。其6个灯中的每一个点灯操作都是一个单独任务。第一个灯每两个时钟节拍做一次异或操作。如果LED1每执行2次异或操作向任务2发一信号量2,每执行3次异或操作向任务3发一信号量3,每执行4次异或操作向任务 4发一信号量4,每执行5次异或操作向任务5发一信号量5,每执行6次异或操作向任务6发一信号量6。那么,任务2到任务6在接到相应的信号量时将对自已控制的灯进行一次异或操作。理论分析,LED2到LED6的波形周期分别为LED1的2到6倍。笔者曾用示波器对6个灯的波形进行观察,其结果与理论分析相符,同时,在连续运行数天后,没有发现死机和复位,证明移植成功。

参考文献

1.Labrosse Jean J.MicroC/OS-ⅡThe Real-Time Kernel
2.邵贝贝.uC/OS-Ⅱ-源码公开的实时嵌入式 操作系统.北京:中国电力出版社,2001


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭