不好意思,我看到了你的程序,呵呵.
"只给您一人看的"
--不好意思,我看到了你的程序,呵呵.
"...这时即使A具有高优先权,并且中断"ISR事件触发令A进入就绪态"....这种抢占切换几乎没有效率"
--在OS中,ISR不会在这种情况下切换到A,因为A等待的"资源"未准备好.(A还是处于挂起状态!).
一般OS都会这样处理,B的优先级别将得到提升,使B尽快执行完毕,释放A所等待的资源. ----这是对"优先级翻转"问题的处理方法!
LZ可以找一下在很多OS理论课本中都讨论到的"进程间优先级翻转问题".
特别对于RTOS: 在实时系统中,A属于最高优先级实时任务,B属于次优先级. RTOS有一套算法,保证AB共享资源(资源mm)时,不会发生"B比A优先执行的情况" .因为在B请求资源mm时,系统优先考虑最高优先级别的任务(任务A).
类似于这样处理:
1, B向OS请求内存控制权时,(用mm表示)
task_B() { ... sys_Get_mm(2ms); 请求为期2毫秒时间的控制权; ...
}
2, RTOS在接到sys_Get_mm(T)系统请求时:
sys_Get_mm(T) { ... if(A任务在2ms内不会再次执行) 将mm控制权交给B, 并恢复B执行; else 将B任务挂起,并将B的请求信息置于资源mm的等待队列中(比如注明B需要与mm约会2ms); ... }
3, 在系统节拍中,RTOS都会去维护资源mm的等待队列,一旦在mm有足够的时间,就将B任务置于就绪状态. 所谓足够的时间,就是A在2ms内不会跟mm约会!
4, 正确理解OS(或RTOS),才能更好地利用OS来简化程序的设计.
比如: B在使用系统请求sys_Get_mm(T)获得控制权后,我们(程序员)必须保证B能在T时间能释放资源mm. 否则,再好的OS,再好的mm,也被你搞得乱套了.
鉴于篇幅问题,这里不多介绍,还是自己再研究一下书本吧.
比如下面这两本: 一本是 汤老师<操作系统原理>,一本是 贝贝博士的<ucOS-ii>,随便一版. |
|