在 mcu 上使用多任务OS 的争论曾经热火朝天,我也偶尔参与了一些探讨,现在还时不时还冒出几个关于 OS 的帖子。我想在这里给大家展示一个精简的调度内核,希望能给有心学习 os 的朋友对多任务有一个基本的认识, 虽然,严格地说,这个多任务调度内核算不上真正的 OS。
网上各种多任务os 的源代码很多,但那些代码对于老鸟阅读理解都很费力,更不用说那些初学者。所以一个简洁易懂的代码更有意义,这也是我做这个多任务调度内核的想法。这个多任务调度内核非常简单,仅有几个函数,200行左右的纯 C代码,没有任何汇编程序,在 Turbo C 下运行。本打算在Borland C++ 5 下编写,不料 BC++ 竟然不支持16bit 源代码调试,所以改在 Turbo C 2.0 下编译。大部分学过 C 的人都会TC,而且 TC 短小精悍,不足之处是不支持鼠标。
什么是操作系统:
http://zh.wikipedia.org/wiki/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F
什么是多任务:
(http://zh.wikipedia.org/wiki/%E5%A4%9A%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86)
多任务处理是指计算机同时运行多个程序的能力。多任务的一般方法是运行第一个程序的一段代码,保存工作环境;再运行第二个程序的一段代码,保存环境;……恢复第一个程序的工作环境,执行第一个程序的下一段代码……现代的多任务,每个程序的时间分配相对平均。
多任务调度的概念上面说的十分清楚,但是,问题是如何?如何保存工作环境,再运行第二个程序的一段代码。什么机制能够切入到第一个程序中?是中断。对于大多数普通的 cpu, 中断是一个最有效手段来打断一个程序,获取程序的控制权,是实现多任务调度内核中的内核。
8086 DOS/BIOS 中断的介绍:
http://tol.bit.edu.cn/download/b4d300d1-49f3-42e5-9782-203fd518eaa5.pdf
DOS 中的定时中断int 08,大约 55ms 中断一次,其中还调用了int 1C。这里我们不使用int 1C, 而是直接使用 int 08, 为了以后便于更改中断时间。
8086 DOS/BIOS的中断与8051的中断不同,是向量中断,即cpu 从中断向量表中取出中断程序的地址,然后转到中断程序。对于定时中断 08,中断程序的地址存放在0000:0020 (绝对地址 00020), 通过改写中断向量,可以指向我们自己的中断程序。要改写中断向量,可以直接读写0000:0020,或者使用TC的函数setvect,getvect.
|