顯示具有 Cooperative Schedular 標籤的文章。 顯示所有文章
顯示具有 Cooperative Schedular 標籤的文章。 顯示所有文章

2008年3月1日 星期六

介紹Time-Triggered Cooperative Scheduler的書


前幾篇我分享的東西就是這一本書的內容。它是講Time-Triggered Cooperative Scheduler如何使用在8051上面來達到各種好處,我在這本書上面獲益良多。我認為大學內的8051課程要用這本當教科書才對,不然大多數的人都會認為寫8051就只是一些IO控制而已。
當然不只有單晶片能夠使用它,之前的分享文章也有提到在有OS的系統上面使用它會有什麼好處,那就請大家細細品嚐這本書囉~~~希望有機會能夠跟大家一起討論喔~~

2008年2月20日 星期三

Cooperative Schedular在有OS的嵌入式系統

如果你的系統是有OS的,Cooperative Schedular又能帶來什麼好處呢?

有許多人會覺得有OS的時候,就可以利用OS的各種API來達成延遲、計時的動作。因為我的工作環境是使用Linux,因此也能夠使用thread來做平行處理。但是有時候我只需要一個簡單的計時功能,計時到了就改變一個變數的值而已,這時也要用thread嗎?或許有人會說用OS提供的timer就可以了阿~~但是OS提供的Timer裡面大多都會用到system call來完成timer的工作,更有OS是新開一個thread來做timer的工作。這些有用到system call的API,最好不要太頻繁的使用,每呼叫一次都要做一次排程,每做一次排程就要context switch等一系列的動作。

但如果是使用Cooperative Schedular來做簡單的計時工作,就可以很快速的在user space來做計時的工作。而且因為每個Task都是在同一個thread上的,所以Task之間共用到的資源不需要再考慮到惱人的同步問題。如果大大小小的東西都用Thread來執行,只要是globol的變數都要去注意它是否有被其他thread所使用,否則就會有race condition的情形。而且Task間沒有資源同步問題,也相當於節省了記憶體的開銷(所有Task可以輪流使用同一塊記憶體)。

依據我的經驗來使用Cooperative Schedular的話,我會在一個Task裡面的動作不會block的情況下全部加入Cooperative Schedular裡面。所謂會block的API大約有:recv()、fread()、read()、usleep()、sleep()、sigsuspend()。

有這麼多利,當然也有弊啦~~jitter是Coooperative Schedular最麻煩的情況了。當某個Task花的CPU時間特別久,那就會導致其他的Task也都在等它做完。不過我是認為這種情況是可避免的,程式是自己寫的,一定會知道它停在哪邊。但如果有一種情況,那就是CPU的loading太高了,高到jitter情況發生。那其實也沒辦法,因為CPU loading太高的話,就算是開thread一樣會lag。

2008年2月19日 星期二

Cooperative Schedular在無OS的嵌入式系統

Cooperative Schedular能夠在小型嵌入式系統提供什麼樣的好處呢? 就拿一般的8051的範例來說,很多的範例所做的延遲功能(Delay),或許是用在LED需要的閃爍延遲、或許是IC的spec所需要的延遲,絕大多數都是使用loop來做:
void delay_10ms( int delay)
{
while( delay ) delay--;
}
然後去微調delay的數量來達到需要的delay時間。如果是只要延遲幾個clock還可以,但是如果是要延遲更長的時間,使用這種方式無疑是讓你的機器做白工。因為在loop的時候,你的CPU是100%的時間都在做一件事情,那就是一直在執行while這個動作。為什麼不想個辦法讓這個工作正在延遲狀態的時候,讓CPU去做別的事情,或是CPU沒事做的話就進入省電模式。等到延遲時間到了以後,CPU才再繼續動作。

但是如果使用Time-Triggered Cooperative Schedular來做這件事情將會非常的有效率,可以讓CPU在有工作的時候去動作。可以很容易的控制每個工作的延遲時間與執行週期,以至於可以在延遲期間或是沒有工作需要執行的時候進入省電模式,降低溫度與耗電。

另外,要怎麼去設計程式,才可以讓一個Task不需要busy loop就可以利用Cooperative Schedular達成延遲的效果呢?過幾天我拿鍵盤掃描的例子來跟大家分享。

Cooperative Schedular(協同排程)介紹

這文章跟大家分享的是協同工作,比較算是討論嵌入式系統的軟體設計部份。這種性質的工作在一個嵌入式系統內是非常必要的一種機制。 如果你想要減少你系統中開thread的數量、如果你想要在8051中妥善的使用CPU資源,那你絕對需要知道如何設計Cooperative Task。
嵌入式系統是一個使用微電腦的軟硬體緊密結合以及其他領域共同開發的系統,而這個系統是用來滿足某一個功能。由於中大型的嵌入式系統所使用的硬體效能足以加入作業系統,讓不同領域的工程師得以自由的撰寫程式,而不必處理太低階的軟硬體資源分配,因為作業系統都有很好的機制來管理這些資源。

過去開發小型嵌入式系統的時候,也許是因為處理器的效能以及記憶體的容量過小,通常是由一個人使用組合語言完成,雖然使用組合語言能夠發揮處理器的最高效能,但可讀性非常的差,導致系統無法由另一個人維護。相當於開發完以後,這個機器就是一個能力很強的深宮怨婦。而現在的微控制器不論速度以及容量都提升不少,但價格卻是越來越便宜。當嵌入式系統的市場需求越來高,很難再由一個人來完成整個系統的時候,就算是小型的嵌入式系統,也需要一個有架構的設計,讓開發團隊參與並且互相合作。在小型嵌入式系統中,通常使用微控制器來開發,若是在上面跑正規的作業系統,將會變成一個龐大的負擔。但是又要讓各個開發人員共同使用有限的資源。這時就非常需要有一個Schedular來管理很多的Cooperative Task。

Cooperative Schedular在一個系統中,就像是一個德國的高速公路,每一台車都要以最快的速度通過高速公路。如果只有單線道,而且有任何一台車停下來,將會導致塞車。如果塞車的時間並沒有嚴重到任何一台車到達目的的時間,那就沒問題。如果太嚴重,則會發生一種叫做jitter的現象。而jitter也就是Cooperative Schedular最需要改善、探討的議題。但在一般的情況下可以將軟即時的Task放在Cooperative Schedular裡面,而需要即時的工作則是利用thread(有OS)或是ISR(無OS)裡面來執行。所以如果把高速公路比喻成Cooperative Schedular來使用CPU,則可以看成:
一般的單晶片就是單線道,如果是在有支援平行處理的OS上,一個Cooperative Schedular跑的thread就是一條線道。而沒有跑Cooperative Schedular的thread可以看作是交流道外的道路。這個比喻各位看倌有feel了嗎?