ucos2.86版本有乙個任務排程的漏洞,該漏洞在2.88之後的版本已經修改過來了,今天我們來看看這個漏洞, 漏洞在官方2.88的文件中如下
這兩個函式都是排程器函式,也就是說排程器有漏洞,但是看官方文件的說明,只有cortex-m3有這個bug,那我們就將2.88的**和2.91的**對比看看改變了哪些
2.86中的**是這樣的:
void os_sched (void)}}
os_exit_critical();
到了2.91中,**變成了這樣
void os_sched (void)}}
os_exit_critical();
通過比較我們發現,**中僅僅做了一件事情,將
ostcbhighrdy = ostcbpriotbl[ospriohighrdy];
放在了比較任務優先順序的動作的前面,那這樣的修改是為什麼呢?官方的解釋是之前的**會造成高優先順序任務無法切換,低優先順序長期占有cpu,最後導致整個程式只有空閒任務還在執行.
至於造成這個中斷的具體原因,我個人覺得這和cortex-m3的晚到中斷和咬尾中斷特性有關係,但是具體關係也還沒想明白,直覺….容我三思
ucos任務排程
1 ostimedly產生延時,假設當前任務a呼叫ostimedly函式,則ostimedly函式就將任務a從任務就緒表中去掉,並將延時時間賦值給任務a的任務控制塊中的ostcbdly,然後呼叫os sched。2 os sched函式,它利用任務就緒表,將就緒任務中的優先順序最高的任務查出,賦值給...
ucos任務排程
實現任務切換,需要呼叫函式ossched void ossched void int8u y os enter critical if oslocknesting osintnesting 0 1 y osunmaptbl osrdygrp ospriohighrdy int8u y 3 osunm...
ucos的任務排程
在多工系統中,都會提供乙個系統函式來進行程序 任務 間切換,綜合來說,他們有兩種程序 任務 切換方式 1 由程序 任務 本身直接呼叫任務切換函式進行程序 任務 切換 在當前程序 任務 因為不能獲得必須的資源而立即被堵塞時,就由程序 任務 本生直接呼叫程序 任務 切換函式進行程序 任務 間排程。在li...