ucosii
第三章内核结构
3.00 临界段,OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()
3 种方法实现上边两个函数:(1) OS_CRITICAL_METHOD==1,用关中断实现
OS_ENTER_CRITICAL,用开中断实现 OS_EXIT_CRITLCAL();此方法的缺点是
如果进入该函数前系统的中断状态是关中断,调用函数后则会改变其中断状态。
(2)OS_CRITICAL_METHOD==2, 用在堆栈中保存现在的中断开关状态,然
后关中断来实现 OS_ENTER_CRITICAL,用从堆栈中弹出原来的中断状态来实
现 OS_EXIT_CRITICAL();此方法存在的问题是:有些编译器不够灵敏,不能正
确进行出入栈操作而引起严重错误。(3)OS_CRITICAL_METHOD==3,用户可
以得到当前处理器的状态字值,并保存在一个 C 函数的局部变量里,这个变量
可以用于恢复 PSW。
3.01 任务
Ucosii 最多管理 64 个任务,但有些被系统保留,所以推荐使用其中的 56 个,
不用前 4 个和后 4 个;为了使 ucosii 管理用户任务,必须在建立任务时,将任
务的起始地址与其他参数传递给 OSTaskCreate()或 OSTaskCreateExt()中
的一个。
3.02 任务状态(睡眠态、就绪态、运行态、中断服务态、等待态)
当所有任务都在等待事件的发生或等待延迟时间的结束时,ucosii 执行空闲任
务 OSTaskIdle().
3.03 任务控制块(OS_TCB)
一旦任务建立,一个任务控制块 OS_TCB 就被赋值,任务控制块是一个数据结
构,当任务的 CPU 使用权被剥夺时,任务控制块用来保存该任务的状态,当任
务重新得到 CPU 的使用权时,任务控制块能确保任务从当时被中断的那一点继
续执行。OS_TCB 全部驻留在 RAM 中。
3.04 就绪表
每个就绪的任务都放在就绪表(ready list)中,就绪表中有两个变量:
OSRdyGrp 和 OSRdyTbl[]. 找出进入就绪态的优先级最高的任务的办法
(ucosii 提供了一个表 OSUnMapTbl[]): y = OSUnMapTbl[OSRdyGrp]; x
= OSUnMapTbl[OSRdyTbl[y]]; prio = (y<<3) + x ;
评论0
最新资源