新闻中心

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

嵌入式实时操作系统μC/OS-II在S12单片机上的移植

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

void OSStartHighRdy(void)

{

OSTaskSwHook(); //调用钩子函数

asm{

ldx OSTCBCur // 加载OSTCBCur 的地址到 x

lds 0,x //把OSTCBStrPtr 载入堆栈指针 sp

ldaa OSRunning

inca // SRunning = TRUE

staa OSRunning

rti

}

}

3.2.4 任务级任务切换函数OSCtxSw()和中断级任务切换函数OSIntCtxSw()

任务级的切换是通过执行软中断指令来实现的。OSCtxSw()实际上就是软中断服务子程序,软中断服务子程序的向量地址指向OSCtxSw()。如果当前任务调用μ提供的功能函数,并使更高优先级任务进入了就绪状态,则μ 就会借助上面提到的向量地址找到OSCtxSw()。在系统服务调用的最后,μ 会调用任务调度函数OSSched(),并由此推断出当前任务不再是需要运行的最重要的任务。

OSIntCtxSw()函数中的绝大多数代码同OS_TASK_SW()函数是一样的。而中断退出函数则是通过函数OSIntCtxSw()来从ISR 中执行切换功能,区别只是因为ISR 已经保存了CPU 的寄存器,而不再需要在OSIntCtxSw()函数中保存CPU 的寄存器。以下只给出任务级任务切换函数OSCtxSw()的代码:

void OSCtxSw(void)

{

asm{

ldx OSTCBCur // 加载当前任务的堆栈指针

sts 0,x // 保存到当前任务的TCB 中

}

OSTaskSwHook(); //调用钩子函数

STCBCur = OSTCBHighRdy; // 改变任务的 OSTCBCur 和OSPrioCur

SPrioCur = OSPrioHighRdy;

asm{

ldx OSTCBCur // 得到新任务的堆栈指针

lds 0,x // 加载新任务的堆栈指针到 sp

rti

}

}

4 代码的测试

为了验证结果是否正确,对后μC/OS-II 代码进行了测试,这是移植中很重要的一个环节。首先对内核自身的运行情况进行了测试,待内核自身的运行正常工作后,又创建三个任务:任务1 通过PORTA 口点亮LED 灯,该任务每秒运行一次;任务2和任务3 都通过串输出字符串,这两个任务都是每2 秒运行一次,并通过信号量来实现互斥,以使得每个任务每次运行时均可完成所有字符的输出。实验测试证明在μC/OS-II管理与调度下,使得这三个任务都能正确、可靠地相继运行。

5 小结

通过μC/OS-II在MC9DG128上的移植,加深了对μC/OS-II内核工作原理和任务调度实现方法的理解,掌握了μC/OS-II移植的一般方法,测试结果表明移植代码可以稳定可靠的运行,实现了多任务的管理和调度。μC/OS-II的引入,不但可以提高系统的性、可靠性和稳定性,还提高了应用软件的可移植性,降低了开发人员的工作量。

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

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭