ucosII学习笔记
(By Nathan.Yu)
2008-10-31
ucOS-II特性:
l 可剥夺内核
l 不支持同优先级的任务时间片轮转调度算法
l 可避免优先级反转
l 不支持优先级继承
l 允许建立63个用户任务
l 仅支持优先级法启动等待信号量的任务
l 仅支持优先级法启动等待消息邮箱的任务
l 支持事件标志,提供事件标志置位、清0和等待事件标志服务
l 支持先进先出(FIFO)和后进先出(LIFO)的消息队列
l 允许中断嵌套,中断嵌套层次可达255层
实现互斥的方法:
l 关中断
l 使用测试并置位指令
l 禁止任务切换
l 使用信号量(信号量初始化为1)
信号量的作用
l 控制共享资源的使用权
l 标志某事件的发生
l 同步2个任务(信号量初始化为0)
可剥夺的内核ucOS任务切换的时机:
(任务切换的时机:当前任务被挂起、或有更高优先级的任务就绪)
l 中断处理程序激活了优先级更高的任务,则当中断返回时发生任务切换
l 等待信号量、邮箱、消息队列的任务被激活(该任务优先级比原任务优先级高)
l 当前任务请求信号量、事件、消息等,然无可用事件时,则当前任务挂起
l 当前任务调用延时函数,将自身延时一段时间。
最简单的防止死锁的方法,让每个任务:
l 先得到全部需要的资源,再做下一步工作。
l 用同样的顺序申请多个资源。
l 释放资源时,使用相反的顺序。
l 设置等待超时
中断及中断处理时间
在大多数情况下,中断服务子程序应识别中断来源,从叫中断的设备取得数据或状态,并通知真正做该事件处理的那个任务。当然应该考虑到是否通知一个任务去做事件处理所花的时间比处理这个事件所花的时间还多。在中断服务中通知一个任务做时间处理(通过信号量、邮箱或消息队列)是需要一定时间的,如果事件处理需花的时间短于给一个任务发通知的时间,就应该考虑在中断服务子程序中做事件处理并在中断服务子程序中开中断,以允许优先级更高的中断打入并优先得到服务。
非屏蔽中断
在非屏蔽中断的中断服务子程序中,不能使用内核提供的服务,因为非屏蔽中断是关不掉的,故不能在非屏蔽中断处理中处理临界区代码。然而向非屏蔽中断传送参数或从非屏蔽中断获取参数还是可以进行的。参数的传递必须使用全程变量,全程变量的位数必须是一次读或写能完成的,即不应该是两个分离的字节,要两次读或写才能完成。
非屏蔽中断服务通常具有最高的优先级,在非屏蔽中断服务过程中不允许中断嵌套,普通中断一直要等到非屏蔽中断服务子程序运行结束后才能被识别。
时钟节拍——抖动解决方案:
l 增加微处理器的时钟频率
l 增加时钟节拍的频率
l 重新安排任务的优先级
l 避免使用浮点运算(如果非使用不可,尽量用单精度数)
l 使用能较好地优化程序代码的编译器
l 时间要求苛刻的代码用汇编语言写
l 如果可能,用同一家族的更快的微处理器做系统升级。如从8086向80186升级,从68000向68020升级等
l
不管怎么样,抖动总是存在的。
使用RTOS的额外需求是
l 内核的价格
l 额外的ROM/RAM开销
l 2到4百分点的CPU额外负荷。