前面已经介绍过,μC/OS-Ⅱ是一种基于优先级的可剥夺型的多任务内核。 了解它的多任务机制原理,有助于写出更加合适的代码来。 其实在单CPU 情况下,是不存在真正的多任务机制的,存在的只是不同的任务轮流使用CPU,所以本质上还是单任务的。 但由于CPU 执行速度非常快,加上任务切换十分频繁并且切换得很快,感觉好像有很多任务同时在运行一样,这就是所谓的“多任务机制”。
由上面的描述不难发现,要实现多任务机制,目标CPU 必须具备一种在运行期更改PC的途径,否则无法做到切换。 不幸的是,直接设置PC 指针,目前还没有哪个CPU 支持这样的指令。 但是,一般CPU 都允许通过类似JMP、CALL 这样的指令来间接地修改PC,多任务机制的实现也正是基于这点。 事实上,使用CALL 指令或者软中断指令来修改PC,主要是软中断。但在一些CPU 上,并不存在“软中断”这个概念,因此,在那些CPU 上,使用几条PUSH 指令加上一条CALL 指令来模拟一次软中断的发生。(www.xing528.com)
μC/OS-Ⅱ中,每个任务都有一个任务控制块,这是一个比较复杂的数据结构。 在任务控制块偏移为“0”的地方,存储着一个指针,记录了所属任务的专用堆栈地址。 事实上,在μC/OS-Ⅱ内,每个任务都有自己的专用堆栈,彼此之间不能侵犯,这点要求开发者在他们的程序中保证。 一般的做法是将它们声明成静态数组而且要声明成OS_STK 类型。 当任务有了自己的堆栈,就可以将每一个任务堆栈在那里记录到前面谈到的任务控制块偏移为“0”的地方。 每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现;然后系统会先将当前任务的堆栈地址保存起来,紧接着恢复要切换的任务的堆栈地址。由于那个任务的堆栈里一定也存的是地址(每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU 就会把地址压入堆栈),这样,就达到了修改PC 为下一个任务的地址的目的。 开发者可以善加利用μC/OS-Ⅱ的多任务实现机制,写出更合适、更富有效率的代码来。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。