這大概是她少數可以讓我拍好的一張照片...
2008年2月29日 星期五
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。
有許多人會覺得有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達成延遲的效果呢?過幾天我拿鍵盤掃描的例子來跟大家分享。
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達成延遲的效果呢?過幾天我拿鍵盤掃描的例子來跟大家分享。
我的嵌入式系統觀念
自從計算機的發明到現在個人電腦的普及,電腦帶動了整個世界的進步,我們利用電腦來操作繁雜的動作或是運算複雜的演算法,當電腦中的處理器越快,就能夠更快的得到我們要的結果,因此在過去的處理器著重的是速度。但現在對於電腦產品的需求已不再是速度,而是多樣化。在個人電腦普及的時代,有許多的工作都能夠在同一台電腦上完成,若是需要特別的功能,只要硬體資源足夠,都能夠利用撰寫軟體來達成該功能,因此個人電腦是一台通用的電腦。但現在有很多的應用是不需要像個人電腦這樣運算功能強大的硬體,像是在PC上可以播放mp3,但有更大的市場需要mp3能夠隨身攜帶,因此設計一個特殊的硬體以及軟體,讓mp3能夠在省電、體積小、價格便宜的市場需求下實現出來。因此mp3播放器可稱為嵌入式系統。而嵌入式系統是在最近幾年才有的概念嗎?那可不,在10多年以前,日本知名公司出產的電視遊樂器,想要玩何種遊戲就插什麼卡,在主機以及卡帶上都有可程式化的處理器,所以早在十多年前日本人就已經大量的利用嵌入式系統了。如果一台PC拿來作為監視系統的平台,算不算是嵌入式系統?我相信許多人的答案是肯定的,因為這個時候PC上的軟體只針對監視系統的各種需求來設計,並不會拿來作為其他用途,因此可稱為嵌入式系統。
嵌入式系統在現在的生活中早已與我們密不可分了,像是手機、汽車的行車電腦、熱水器、瓦斯爐等等,都是嵌入式系統的一環,隨著處理器的進步,嵌入式系統只會越來越多,並且一步步地提供我們更好的生活。
嵌入式系統是根據不同的需求,來設計不同的硬體以及軟體,以達到成本、利益與需求的平衡。所以相對於個人電腦,嵌入式系統是一個依據特殊需求所設計的一個系統,在設計階段不僅包含了微電腦軟硬體緊密的設計,也要考量到不同領域的合作。像是美國太空總署所開發的火星探測車至少就包含了控制、太空科學、通訊等許多專業領域的結合,並且利用微電腦來將各領域所製造的模組整合起來,使其穩定的工作。因此開發一個嵌入式系統需要與各種領域的開發人員互相合作,並且以軟硬體緊密的結合達到系統功能完全的符合規格,所以嵌入式系統不是只有一個人就能完成的系統,而是要與各個不同領域的工程師互相合作。
有很多人初學嵌入式系統都有一個疑問:一個過去稱為微處理機系統或是微電腦系統的裝置,為何現在有另一個名稱叫做嵌入式系統?嵌入式系統的原文是Embedded system,Embedded是一個形容詞,意思是「被放入的」,而Embedded system照字面上的翻譯是一個「被放入的系統」,聽起來感覺是一個未完成的字彙,到底一個系統會被放入什麼東西呢?那就是—微電腦,一個可程式化的微電腦被放入到一個系統中就可稱為嵌入式系統。而嵌入式系統可大約分為下列幾種:
1. 小型嵌入式系統(通常無OS、至少一個人可完成軟硬體設計,如:來電顯示器)
2. 中型嵌入式系統(有OS、一個研發團隊可完成,如:Wii、電腦字典、手機)
3. 大型嵌入式系統(有OS、跨研發團隊、跨公司,如:飛行模擬系統)
嵌入式系統在現在的生活中早已與我們密不可分了,像是手機、汽車的行車電腦、熱水器、瓦斯爐等等,都是嵌入式系統的一環,隨著處理器的進步,嵌入式系統只會越來越多,並且一步步地提供我們更好的生活。
嵌入式系統是根據不同的需求,來設計不同的硬體以及軟體,以達到成本、利益與需求的平衡。所以相對於個人電腦,嵌入式系統是一個依據特殊需求所設計的一個系統,在設計階段不僅包含了微電腦軟硬體緊密的設計,也要考量到不同領域的合作。像是美國太空總署所開發的火星探測車至少就包含了控制、太空科學、通訊等許多專業領域的結合,並且利用微電腦來將各領域所製造的模組整合起來,使其穩定的工作。因此開發一個嵌入式系統需要與各種領域的開發人員互相合作,並且以軟硬體緊密的結合達到系統功能完全的符合規格,所以嵌入式系統不是只有一個人就能完成的系統,而是要與各個不同領域的工程師互相合作。
有很多人初學嵌入式系統都有一個疑問:一個過去稱為微處理機系統或是微電腦系統的裝置,為何現在有另一個名稱叫做嵌入式系統?嵌入式系統的原文是Embedded system,Embedded是一個形容詞,意思是「被放入的」,而Embedded system照字面上的翻譯是一個「被放入的系統」,聽起來感覺是一個未完成的字彙,到底一個系統會被放入什麼東西呢?那就是—微電腦,一個可程式化的微電腦被放入到一個系統中就可稱為嵌入式系統。而嵌入式系統可大約分為下列幾種:
1. 小型嵌入式系統(通常無OS、至少一個人可完成軟硬體設計,如:來電顯示器)
2. 中型嵌入式系統(有OS、一個研發團隊可完成,如:Wii、電腦字典、手機)
3. 大型嵌入式系統(有OS、跨研發團隊、跨公司,如:飛行模擬系統)
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了嗎?
嵌入式系統是一個使用微電腦的軟硬體緊密結合以及其他領域共同開發的系統,而這個系統是用來滿足某一個功能。由於中大型的嵌入式系統所使用的硬體效能足以加入作業系統,讓不同領域的工程師得以自由的撰寫程式,而不必處理太低階的軟硬體資源分配,因為作業系統都有很好的機制來管理這些資源。
過去開發小型嵌入式系統的時候,也許是因為處理器的效能以及記憶體的容量過小,通常是由一個人使用組合語言完成,雖然使用組合語言能夠發揮處理器的最高效能,但可讀性非常的差,導致系統無法由另一個人維護。相當於開發完以後,這個機器就是一個能力很強的深宮怨婦。而現在的微控制器不論速度以及容量都提升不少,但價格卻是越來越便宜。當嵌入式系統的市場需求越來高,很難再由一個人來完成整個系統的時候,就算是小型的嵌入式系統,也需要一個有架構的設計,讓開發團隊參與並且互相合作。在小型嵌入式系統中,通常使用微控制器來開發,若是在上面跑正規的作業系統,將會變成一個龐大的負擔。但是又要讓各個開發人員共同使用有限的資源。這時就非常需要有一個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了嗎?
2008年2月17日 星期日
訂閱:
意見 (Atom)
