V
μ
C/OS
?/p>
μ
C/OS-II
是专门为计算机的嵌入式应用设计的?/p>
绝大部分代码是用
C
语言编写
的?/p>
CPU
硬件相关部分是用汇编语言编写的?/p>
总量?/p>
200
行的汇编语言部分被压缩到最低限度,
为的是便于移植到任何一种其它的
CPU
上?
工作原理
编辑
uC/OS-II
是一种基于优先级的可抢先的硬实时内核?/p>
要实现多任务机制
,
那么目标
CPU
必须具备一种在运行期更?/p>
PC
的途径
,
否则无法做到?/p>
换。不幸的?/p>
,
直接设置
PC
指针
,
还没有哪?/p>
CPU
支持这样的指令。但是一?/p>
CPU
都允许通过
类似
JMP
,CALL
这样的指令来间接的修?/p>
PC
?/p>
我们的多任务机制的实现也正是基于这个出发点?/p>
事实?/p>
,
我们使用
CALL
指令或?/p>
软中?/p>
指令来修?/p>
PC,
主要是软中断。但在一?/p>
CPU
?/p>
,
并不
存在
软中?/p>
这样的概?/p>
,
所?/p>
,
我们在那?/p>
CPU
?/p>
,
使用几条
PUSH
指令
加上一?/p>
CALL
指令来模
拟一次软中断的发生?/p>
?/p>
uC/OS-II
?/p>
,
每个任务都有一个任务控制块
(Task
Control
Block),
这是一个比较复杂的
?/p>
据结?/p>
。在任务控制块的偏移?/p>
0
的地?/p>
,
存储着一?/p>
指针
,
它记录了所属任务的专用堆栈地址?/p>
事实?/p>
,
?/p>
uC/OS-II
?/p>
,
每个任务都有自己的专用堆?/p>
,
彼此之间不能侵犯。这点要求程序员在他
们的程序中保证。一般的做法是把他们申明?/p>
静态数?/p>
。而且要申明成
OS_STK
类型。当任务
有了自己的堆?/p>
,
那么就可以将每一个任务堆栈在那里记录到前面谈到的任务控制快偏移为
0
?/p>
地方。以后每当发生任务切?/p>
,
系统必然会先进入一个中?/p>
,
这一般是通过
软中?/p>
或?/p>
时钟中断
?/p>
现。然后系统会先把当前任务的堆栈地址保存起来
,
仅接着恢复要切换的任务的堆栈地址。由?/p>
哪个任务的堆栈里一定也存的是地址(还记得我们前面说过?/p>
,
每当发生任务切换
,
系统必然会先
进入一个中?/p>
,
而一旦中?/p>
CPU
就会把地址压入堆栈?/p>
,
这样
,
就达到了修改
PC
为下一个任务的
地址的目的?/p>
2
任务管理
编辑
uC/OS-II
中最多可以支?/p>
64
个任务,分别对应优先?/p>
0
?/p>
63
,其?/p>
0
为最高优先级?/p>
63
为最低级,系统保留了
4
个最高优先级的任务和
4
个最低优先级的任务,所有用户可以使用的?/p>
务数?/p>
56
个?/p>
uC/OS-II
提供?/p>
任务管理
的各?/p>
函数调用
,包括创建任务,删除任务,改变任务的优先级,
任务挂起和恢复等?/p>
系统初始?/p>
时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一?/p>
整型变量
做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当?/p>
cpu
的利
用率?/p>