嵌入式C語言優(yōu)化技巧
嵌入式系統(tǒng)是指完成一種或幾種特定功能的計算機系統(tǒng),具有自動化程度高,響應(yīng)速度快等優(yōu)點,目前已廣泛應(yīng)用于消費電子,工業(yè)控制等領(lǐng)域。嵌入式系統(tǒng)受其使用的硬件以及運行環(huán)境的限制,非常注重代碼的時間和空間效率,因此選擇一種合適的開發(fā)語言十分重要。下面是嵌入式C語言優(yōu)化技巧相關(guān)的知識,歡迎閱讀。
目前,在嵌入式系統(tǒng)開發(fā)中可使用的語言很多,其中 C語言應(yīng)用得最廣泛。雖然用 C 語言編程具有許多優(yōu)點,但基于嵌入式系統(tǒng)的C語言和標準 C語言又有很大區(qū)別。接下來小編結(jié)合嵌入式系統(tǒng)的特點和高手們的一些積累,給大家整理出在程序設(shè)計中代碼優(yōu)化的一些小技巧。
1、嵌入式C語言的特點
作為一種結(jié)構(gòu)化程序設(shè)計語言,C 語言兼顧多種高級語言的特點,具有很強的功能性和可移植性。但在嵌入式系統(tǒng)開發(fā)中,出于對低價產(chǎn)品的需求,系統(tǒng)的計算能力和存儲容量都非常有限,因此如何利用好這些資源就顯得十分重要。開發(fā)人員應(yīng)注意嵌入式 C語言和標準 C 語言的區(qū)別,減少生成代碼長度,提高程序執(zhí)行效率,在程序設(shè)計中對代碼進行優(yōu)化。
2、C代碼在程序中的優(yōu)化
現(xiàn)在的 C 編譯器會自動對代碼進行優(yōu)化,但這些優(yōu)化是對執(zhí)行速度和代碼長度的平衡。如果要獲得更小且執(zhí)行效率更高的代碼,需要程序員手工對代碼進行優(yōu)化。
3、變量類型的定義
不同的數(shù)據(jù)類型所生成的機器代碼長度相差很多,變量類型選取的范圍越小運行速度越快,占用的內(nèi)存越少。能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。相同類型的數(shù)據(jù)類型,有無符號對機器代碼長度也有影響。因此我們應(yīng)按照實際需要合理的選用數(shù)據(jù)類型。當然,在定義變量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C編譯器并不報錯,但程序運行結(jié)果卻錯了,而且這樣的錯誤很難發(fā)現(xiàn)。
4、算法優(yōu)化
算法優(yōu)化指對程序時空復(fù)雜度的優(yōu)化:在 PC 機上進行程序設(shè)計時一般不必過多關(guān)注程序代碼的長短,只需考慮功能的實現(xiàn),但嵌入式系統(tǒng)就必須考慮系統(tǒng)的硬件資源,在程序設(shè)計時,應(yīng)盡量采用生成代碼短的算法,在不影響程序功能實現(xiàn)的情況下優(yōu)化算法。
5、適當?shù)氖褂煤?/strong>
在C程序中使用宏代碼可以提高程序的執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來像函數(shù)。函數(shù)調(diào)用要使用系統(tǒng)的棧來保存數(shù)據(jù),同時 CPU 在函數(shù)調(diào)用時需要保存和恢復(fù)當前的現(xiàn)場,進行進棧和出棧操作,所以函數(shù)調(diào)用也需要 CPU時間。而宏定義就沒有這個問題:宏定義僅僅作為預(yù)先寫好的代碼嵌入到當前程序中,不產(chǎn)生函數(shù)調(diào)用,所占用的僅僅是一些空間,省去了參數(shù)壓棧,生成匯編語言的 call 調(diào)用,返回參數(shù),執(zhí)行 return等過程,從而提高了程序的執(zhí)行速度。雖然宏破壞了程序的可讀性,使排錯更加麻煩,但對于嵌入式系統(tǒng),為了達到要求的性能,嵌入代碼常常是必須的做法。
此外,我們還要避免不必要的函數(shù)調(diào)用,請看下面的代碼:
[plain] view plain copy print?
void str_print( char *str )
{
int i;
for ( i = 0; i < strlen ( str ); i++ )
{
printf("%c",str[ i ] );
}
}
void str_print1 ( char *str )
{
int len;
len = strlen ( str );
for ( i = 0; i < len; i++ )
{
printf("%c",str[ i ] );
}
}
請注意,這兩個函數(shù)的功能相似。然而,第一個函數(shù)調(diào)用strlen函數(shù)多次,而第二個函數(shù)只調(diào)用函數(shù)strlen一次。因此第二個函數(shù)性能明顯比第一個好。
6、內(nèi)嵌匯編
程序中對時間要求苛刻的部分可以用內(nèi)嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發(fā)和測試匯編代碼是一件辛苦的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。在程序中,存在一個80-20原則,即20%的程序消耗了80%的運行時間,因而我們要改進效率,最主要是考慮改進那20%的代碼。
7、提高循環(huán)語言的效率
在 C 語言中循環(huán)語句使用頻繁,提高循環(huán)體效率的基本辦法就是降低循環(huán)體的復(fù)雜性:
(1) 在多重循環(huán)中,應(yīng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層。這樣可以減少 CPU跨切循環(huán)的次數(shù)。如例 1-1 的效率比 1-2 的效率要低:
[plain] view plain copy print?
for (j = 0; j < 30; j++)
{
for (i = 0; i < 10; i++)
{……}
} // 例子 1-1
for (i = 0; i < 10; i++)
{
for (j = 0; j < 30; j++)
{……}
} // 例子 2-2 程序部簡潔但效率高
8、提高 switch 語句的效率
switch 語句是 C 語言中常用的選擇語句, 在編譯時會產(chǎn)生if- else- if 嵌套代碼,并按照順序進行比較,發(fā)現(xiàn)匹配時,就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。
當 switch 語句中的 case 標號很多時,為了減少比較的次數(shù),可以把發(fā)生頻率相對高的條件放到第一位或者把整個 switch 語句轉(zhuǎn)化嵌套 switch 語句。把發(fā)生頻率高的 case 標號放在最外層的 switch 語句中,發(fā)生相對頻率相對低的 case 標號放在另外的 switch 語句中。如例 3 中,把發(fā)生率高的case 標號放在外層的 switch 語句中,把發(fā)生頻率低的放在缺省的(default)內(nèi)層 switch 語句中。
[plain] view plain copy print?
switch (表達式)
{
case 值1:
語句1: break;
case 值2:
語句2:break;
……
/*把發(fā)生頻率低的放在內(nèi)層的switch語句中*/
default:
switch (表達式)
{
case 值n:
語句n: break;
case 值m:
語句m: break;
……
}
}
例子3 使用嵌套switch語句提高程序執(zhí)行效率。
9、避免使用標準庫
使用 C語言標準庫可以加快開發(fā)進度,但由于標準庫需要設(shè)法處理用戶所有可能遇到的情況,所以很多標準庫代碼很大。比如標準庫中的 sprintf函數(shù)非常大。這個龐大的代碼中有很大一部分用于處理浮點數(shù),如果程序中不需要格式化浮點數(shù)值( 如%f),程序設(shè)計人員就可以根據(jù)實際情況用少量的代碼實現(xiàn)這個功能。
10、采用數(shù)學方法優(yōu)化程序
數(shù)學是計算機之母,沒有數(shù)學的依據(jù)和基礎(chǔ),就沒有計算機的發(fā)展,所以在編寫程序的時候,采用一些數(shù)學方法會對程序的執(zhí)行效率有數(shù)量級的提高。有時候這個問題常常被大家忽略, 對于沒有經(jīng)驗的程序員來說更是如此。例如:求 1~100 的和:
sum = 100*(100+1)/2;
數(shù)學公式: (a1 + an)*n/2
使用C語言的位操作可以減少除法和取模的運算。在計算機程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運算”來完成所有的運算和操作。因而,靈活的位操作可以有效地提高程序運行的效率。比如用用位操作區(qū)代替除法:比如:128 / 8 ->> 128 >> 3;
優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)對提高代碼的效率有很大的幫助。當然有時候時間效率和空間效率是對立的,此時應(yīng)分析哪個更重要, 做出適當?shù)恼壑。另外,在進行優(yōu)化的時候不要片面的追求緊湊的代碼,因為緊湊的代碼并不能產(chǎn)生高效率的機器碼。
11、存儲器分配
由于成本限制,嵌入式系統(tǒng)存儲器容量有限。程序中所有的變量,包含的庫函數(shù)以及堆棧等都使用有限的內(nèi)存:全局變量在整個程序范圍內(nèi)都有效。程序執(zhí)行完后才會釋放;靜態(tài)變量的作用范圍也是整個程序,只有局部變量中的動態(tài)變量在函數(shù)執(zhí)行完后會釋放。因此, 在程序中應(yīng)盡量使用局部變量,提高內(nèi)存使用效率。程序中堆的大小受限于所有全局數(shù)據(jù)和?臻g都分配后的剩余量,如果堆太小,程序不能夠在需要的時候分配內(nèi)存。因此在使用 malloc 函數(shù)申請內(nèi)存之后一定要用 free 函數(shù)進行釋放, 防止內(nèi)存泄露。
12、選擇好的無限循環(huán)
在編程中,我們常常需要用到無限循環(huán),常用的兩種方法是while (1) 和 for (;;)。這兩種方法效果完全一樣,但那一種更好呢?然我們看看它們編譯后的代碼:
編譯前:
while (1);
編譯后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
編譯前:
for (;;);
編譯后:
jmp foo+23h
顯然,for (;;)指令少,不占用寄存器,而且沒有判斷,跳轉(zhuǎn),比while (1)好。
13、使用Memoization,以避免遞歸重復(fù)計算
考慮Fibonacci(斐波那契)問題,F(xiàn)ibonacci問題是可以通過簡單的遞歸方法來解決:
[plain] view plain copy print?
1. int fib ( n )
2. {
3. if ( n == 0 || n == 1 )
4. {
5. return 1;
6. }
7. else
8. {
9. return fib( n - 2 ) + fib ( n - 1 );
10. }
11. }
注:在這里,我們考慮Fibonacci 系列從1開始,因此,該系列看起來:1,1,2,3,5,8,…
注意:從遞歸樹,我們計算fib(3)函數(shù)2次,fib(2)函數(shù)3次。這是相同函數(shù)的重復(fù)計算。如果n非常大,fib函數(shù)的效率會比較低。Memoization是一個簡單的技術(shù),可以被用在遞歸,加強計算速度。fibonacci 函數(shù)Memoization的代碼如下:
[plain] view plain copy print?
1. int calc_fib ( int n )
2. {
3. int val[ n ] , i;
4. for ( i = 0; i <=n; i++ )
5. {
6. val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1
7. }
8. val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1
9. val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1
10. return fib( n , val );
11. }
12.
13. int fib( int n , int* value )
14. {
15. if ( value[ n ] != -1 )
16. {
17. return value[ n ]; // Using memoization
18. }
19. else
20. {
21. value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term
22. }
23. return value[ n ]; // Returning the value
24. }
除了編程上的技巧外,為提高系統(tǒng)的運行效率,我們通常也需要最大可能地利用各種硬件設(shè)備自身的特點來減小其運轉(zhuǎn)開銷,例如減小中斷次數(shù),利用DMA傳輸方式等。
嵌入式C語言簡介
簡單地說,嵌入式系統(tǒng)集系統(tǒng)的應(yīng)用軟件與硬件于一體,類似于 PC 中 BIOS 的工作方式,具有軟件代碼小、高度自動化、響應(yīng)速度快等特點,特別適合于要求實時和多任務(wù)的體系。嵌入式系統(tǒng)主要由嵌入式處理器、相關(guān)支撐硬件、嵌入式操作系統(tǒng)及應(yīng)用軟件系統(tǒng)等組成,它是可獨立工作的“器件”。
嵌入式系統(tǒng)幾乎包括了生活中的所有電器設(shè)備,如掌上 PDA 、移動計算設(shè)備、電視機頂盒、手機上網(wǎng)、數(shù)字電視、多媒體、汽車、微波爐、數(shù)字相機、家庭自動化系統(tǒng)、電梯、空調(diào)、安全系統(tǒng)、自動售貨機、蜂窩式電話、消費電子設(shè)備、工業(yè)自動化儀表與醫(yī)療儀器等。
嵌入式系統(tǒng)的硬件部分,包括處理器 / 微處理器、存儲器及外設(shè)器件和 I/O 端口、圖形控制器等。嵌入式系統(tǒng)有別于一般的計算機處理系統(tǒng),它不具備像硬盤那樣大容量的存儲介質(zhì),而大多使用 EPROM 、 EEPROM 或閃存 (Flash Memory) 作為存儲介質(zhì)。軟件部分包括操作系統(tǒng)軟件 ( 要求實時和多任務(wù)操作 ) 和應(yīng)用程序編程。應(yīng)用程序控制著系統(tǒng)的運作和行為;而操作系統(tǒng)控制著應(yīng)用程序編程與硬件的交互作用。 據(jù)不完全統(tǒng)計,目前全世界嵌入式處理器的品種總量已經(jīng)超過 1000 種,流行的體系結(jié)構(gòu)有 30 多個系列。其中 8051 體系占多半,生產(chǎn)這種單片機的半導(dǎo)體廠家有 20 多個,共 350 多種衍生產(chǎn)品,僅 Philips 就有近 100 種,F(xiàn)在幾乎每個半導(dǎo)體制造商都生產(chǎn)嵌入式處理器,越來越多的公司有自己的處理器設(shè)計部門。嵌入式處理器的尋址空間一般從 64kB 到 16MB ,處理速度為 0.1~2000MIPS ,常用封裝 8~144 個引腳。
根據(jù)現(xiàn)狀,嵌入式計算機可分成下面幾類。
(1) 嵌入式微處理器 (Embedded Microprocessor Unit, EMPU)
嵌入式微處理器采用“增強型”通用微處理器。由于嵌入式系統(tǒng)通常應(yīng)用于環(huán)境比較惡劣的環(huán)境中,因而嵌入式微處理器在工作溫度、電磁兼容性以及可靠性方面的要求較通用的標準微處理器高。但是,嵌入式微處理器在功能方面與標準的微處理器基本上是一樣的。根據(jù)實際嵌入式應(yīng)用要求,將嵌入式微處理器裝配在專門設(shè)計的主板上,只保留和嵌入式應(yīng)用有關(guān)的主板功能,這樣可以大幅度減小系統(tǒng)的體積和功耗。和工業(yè)控制計算機相比,嵌入式微處理器組成的系統(tǒng)具有體積小、重量輕、成本低、可靠性高的優(yōu)點,但在其電路板上必須包括 ROM 、 RAM 、總線接口、各種外設(shè)等器件,從而降低了系統(tǒng)的可靠性,技術(shù)保密性也較差。由嵌入式微處理器及其存儲器、總線、外設(shè)等安裝在一塊電路主板上構(gòu)成一個通常所說的單板機系統(tǒng)。嵌入式處理器目前主要有 Am186/88 、 386EX 、 SC-400 、 Power PC 、 68000 、 MIPS 、 ARM 系列等。
(2) 嵌入式微控制器 (Microcontroller Unit, MCU) (3) 嵌入式 DSP 處理器 (Embedded Digital Signal Processor, EDSP (4) 嵌入式片上系統(tǒng) (System On Chip, SOC)
隨著 EDI 的推廣和 VLSI 設(shè)計的普及化,以及半導(dǎo)體工藝的迅速發(fā)展,可以在一塊硅片上實現(xiàn)一個更為復(fù)雜的系統(tǒng),這就產(chǎn)生了 SOC 技術(shù)。各種通用處理器內(nèi)核將作為 SOC 設(shè)計公司的標準庫,和其他許多嵌入式系統(tǒng)外設(shè)一樣,成為 VLSI 設(shè)計中一種標準的器件,用標準的 VHDL 、 Verlog 等硬件語言描述,存儲在器件庫中。用戶只需定義出其整個應(yīng)用系統(tǒng),仿真通過后就可以將設(shè)計圖交給半導(dǎo)體工廠制作樣品。這樣除某些無法集成的器件以外,整個嵌入式系統(tǒng)大部分均可集成到一塊或幾塊芯片中去,應(yīng)用系統(tǒng)電路板將變得很簡單,對于減小整個應(yīng)用系統(tǒng)體積和功耗、提高可靠性非常有利。 SOC 可分為通用和專用兩類,通用 SOC 如 Infineon(Siemens) 的 TriCore 、 Motorola 的 M-Core ,以及某些 ARM 系列器件,如 Echelon 和 Motorola 聯(lián)合研制的 Neuron 芯片等;專用 SOC 一般專用于某個或某類系統(tǒng)中,如 Philips 的 Smart XA ,它將 XA 單片機內(nèi)核和支持超過 2048 位復(fù)雜 RSA 算法的 CCU 單元制作在一塊硅片上,形成一個可加載 Java 或 C 語言的專用 SOC ,可用于互聯(lián)網(wǎng)安全方面。
嵌入式操作系統(tǒng)是一種支持嵌入式系統(tǒng)應(yīng)用的操作系統(tǒng)軟件,它是嵌入式系統(tǒng) ( 包括硬、軟件系統(tǒng) ) 極為重要的組成部分,通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面、標準化瀏覽器等 Browser 。嵌入式操作系統(tǒng)具有通用操作系統(tǒng)的基本特點,如能夠有效管理越來越復(fù)雜的系統(tǒng)資源;能夠把硬件虛擬化,使得開發(fā)人員從繁忙的驅(qū)動程序移植和維護中解脫出來;能夠提供庫函數(shù)、驅(qū)動程序、工具集以及應(yīng)用程序 。與通用操作系統(tǒng)相比較,嵌入式操作系統(tǒng)在系統(tǒng)實時高效性、硬件的相關(guān)依賴性、軟件固態(tài)化以及應(yīng)用的專用性等方面具有較為突出的特點。
1. 嵌入式操作系統(tǒng)的`種類
一般情況下,嵌入式操作系統(tǒng)可以分為兩類,一類是面向控制、通信等領(lǐng)域的實時操作系統(tǒng),如 WindRiver 公司的 VxWorks 、 ISI 的 pSOS 、 QNX 系統(tǒng)軟件公司的 QNX 、 ATI 的 Nucleus 等;另一類是面向消費電子產(chǎn)品的非實時操作系統(tǒng),這類產(chǎn)品包括個人數(shù)字助理 (PDA) 、移動電話、機頂盒、電子書、 WebPhone 等。
a. 非實時操作系統(tǒng)
早期的嵌入式系統(tǒng)中沒有操作系統(tǒng)的概念,程序員編寫嵌入式程序通常直接面對裸機及裸設(shè)備。在這種情況下,通常把嵌入式程序分成兩部分,即前臺程序和后臺程序。前臺程序通過中段來處理事件,其結(jié)構(gòu)一般為無限循環(huán);后臺程序則掌管整個嵌入式系統(tǒng)軟、硬件資源的分配、管理以及任務(wù)的調(diào)度,是一個系統(tǒng)管理調(diào)度程序。這就是通常所說的前后臺系統(tǒng)。一般情況下,后臺程序也叫任務(wù)級程序,前臺程序也叫事件處理級程序。在程序運行時,后臺程序檢查每個任務(wù)是否具備運行條件,通過一定的調(diào)度算法來完成相應(yīng)的操作。對于實時性要求特別嚴格的操作通常由中斷來完成,僅在中斷服務(wù)程序中標記事件的發(fā)生,不再做任何工作就退出中斷,經(jīng)過后臺程序的調(diào)度,轉(zhuǎn)由前臺程序完成事件的處理,這樣就不會造成在中斷服務(wù)程序中處理費時的事件而影響后續(xù)和其他中斷。
實際上,前后臺系統(tǒng)的實時性比預(yù)計的要差。這是因為前后臺系統(tǒng)認為所有的任務(wù)具有相同的優(yōu)先級別,即是平等的,而且任務(wù)的執(zhí)行又是通過 FIFO 隊列排隊,因而對那些實時性要求高的任務(wù)不可能立刻得到處理。另外,由于前臺程序是一個無限循環(huán)的結(jié)構(gòu),一旦在這個循環(huán)體中正在處理的任務(wù)崩潰,使得整個任務(wù)隊列中的其他任務(wù)得不到機會被處理,從而造成整個系統(tǒng)的崩潰。由于這類系統(tǒng)結(jié)構(gòu)簡單,幾乎不需要 RAM/ROM 的額外開銷,因而在簡單的嵌入式應(yīng)用被廣泛使用。
b. 實時操作系統(tǒng)
實時系統(tǒng)是指能在確定的時間內(nèi)執(zhí)行其功能并對外部的異步事件做出響應(yīng)的計算機系統(tǒng)。其操作的正確性不僅依賴于邏輯設(shè)計的正確程度,而且與這些操作進行的時間有關(guān)!霸诖_定的時間內(nèi)”是該定義的核心。也就是說,實時系統(tǒng)是對響應(yīng)時間有嚴格要求的。
實時系統(tǒng)對邏輯和時序的要求非常嚴格,如果邏輯和時序出現(xiàn)偏差將會引起嚴重后果。實時系統(tǒng)有兩種類型:軟實時系統(tǒng)和硬實時系統(tǒng)。軟實時系統(tǒng)僅要求事件響應(yīng)是實時的,并不要求限定某一任務(wù)必須在多長時間內(nèi)完成;而在硬實時系統(tǒng)中,不僅要求任務(wù)響應(yīng)要實時,而且要求在規(guī)定的時間內(nèi)完成事件的處理。通常,大多數(shù)實時系統(tǒng)是兩者的結(jié)合。實時應(yīng)用軟件的設(shè)計一般比非實時應(yīng)用軟件的設(shè)計困難。實時系統(tǒng)的技術(shù)關(guān)鍵是如何保證系統(tǒng)的實時性。
實時多任務(wù)操作系統(tǒng)是指具有實時性、能支持實時控制系統(tǒng)工作的操作系統(tǒng)。其首要任務(wù)是調(diào)度一切可利用的資源完成實時控制任務(wù),其次才著眼于提高計算機系統(tǒng)的使用效率,重要特點是要滿足對時間的限制和要求。實時操作系統(tǒng)具有如下功能:任務(wù)管理 ( 多任務(wù)和基于優(yōu)先級的任務(wù)調(diào)度 ) 、任務(wù)間同步和通信 ( 信號量和郵箱等 ) 、存儲器優(yōu)化管理 ( 含 ROM 的管理 ) 、實時時鐘服務(wù)、中斷管理服務(wù)。實時操作系統(tǒng)具有如下特點:規(guī)模小,中斷被屏蔽的時間很短,中斷處理時間短,任務(wù)切換很快。
實時操作系統(tǒng)可分為可搶占型和不可搶占型兩類。對于基于優(yōu)先級的系統(tǒng)而言,可搶占型實時操作系統(tǒng)是指內(nèi)核可以搶占正在運行任務(wù)的 CPU 使用權(quán)并將使用權(quán)交給進入就緒態(tài)的優(yōu)先級更高的任務(wù),是內(nèi)核搶了 CPU 讓別的任務(wù)運行。不可搶占型實時操作系統(tǒng)使用某種算法并決定讓某個任務(wù)運行后,就把 CPU 的控制權(quán)完全交給了該任務(wù),直到它主動將 CPU 控制權(quán)還回來。中斷由中斷服務(wù)程序來處理,可以激活一個休眠態(tài)的任務(wù),使之進入就緒態(tài);而這個進入就緒態(tài)的任務(wù)還不能運行,一直要等到當前運行的任務(wù)主動交出 CPU 的控制權(quán)。使用這種實時操作系統(tǒng)的實時性比不使用實時操作系統(tǒng)的系統(tǒng)性能好,其實時性取決于最長任務(wù)的執(zhí)行時間。不可搶占型實時操作系統(tǒng)的缺點也恰恰是這一點,如果最長任務(wù)的執(zhí)行時間不能確定,系統(tǒng)的實時性就不能確定。
可搶占型實時操作系統(tǒng)的實時性好,優(yōu)先級高的任務(wù)只要具備了運行的條件,或者說進入了就緒態(tài),就可以立即運行。也就是說,除了優(yōu)先級最高的任務(wù),其他任務(wù)在運行過程中都可能隨時被比它優(yōu)先級高的任務(wù)中斷,讓后者運行。通過這種方式的任務(wù)調(diào)度保證了系統(tǒng)的實時性,但是,如果任務(wù)之間搶占 CPU 控制權(quán)處理不好,會產(chǎn)生系統(tǒng)崩潰、死機等嚴重后果。
2. 嵌入式操作系統(tǒng)的發(fā)展
嵌入式操作系統(tǒng)伴隨著嵌入式系統(tǒng)的發(fā)展經(jīng)歷了 4 個比較明顯的階段。
第一階段是無操作系統(tǒng)的嵌入算法階段,是以單芯片為核心的可編程控制器形式的系統(tǒng),同時具有與監(jiān)測、伺服、指示設(shè)備相配合的功能。這種系統(tǒng)大部分應(yīng)用于一些專業(yè)性極強的工業(yè)控制系統(tǒng)中,一般沒有操作系統(tǒng)的支持,通過匯編語言編程對系統(tǒng)進行直接控制,運行結(jié)束后清除內(nèi)存。這一階段系統(tǒng)的主要特點是:系統(tǒng)結(jié)構(gòu)和功能都相對單一,處理效率較低,存儲容量較小,幾乎沒有用戶接口。由于這種嵌入式系統(tǒng)使用簡便、價格很低,以前在國內(nèi)工業(yè)領(lǐng)域應(yīng)用較為普遍,但是已經(jīng)遠遠不能適應(yīng)高效的、需要大容量存儲介質(zhì)的現(xiàn)代化工業(yè)控制和新興的信息家電等領(lǐng)域的需求。
第二階段是以嵌入式 CPU 為基礎(chǔ)、以簡單操作系統(tǒng)為核心的嵌入式系統(tǒng)。這一階段系統(tǒng)的主要特點是: CPU 種類繁多,通用性比較差;系統(tǒng)開銷小, 效率高;一般配備系統(tǒng)仿真器,操作系統(tǒng)具有一定的兼容性和擴展性;應(yīng)用軟件較專業(yè),用戶界面不夠友好;系統(tǒng)主要用來控制系統(tǒng)負載以及監(jiān)控應(yīng)用程序運行。
第三階段是通用的嵌入式實時操作系統(tǒng)階段,是以嵌入式操作系統(tǒng)為核心的嵌入式系統(tǒng)。這一階段系統(tǒng)的主要特點是:嵌入式操作系統(tǒng)能運行于各種不同類型的微處理器上,兼容性好;操作系統(tǒng)內(nèi)核精小、效率高,并且具有高度的模塊化和擴展性;具備文件和目錄管理、設(shè)備支持、多任務(wù)、網(wǎng)絡(luò)支持、圖形窗口以及用戶界面等功能;具有大量的應(yīng)用程序接口 (API) ,開發(fā)應(yīng)用程序簡單;嵌入式應(yīng)用軟件豐富。
第四階段是以基于 Internet 為標志的嵌入式系統(tǒng),這是一個正在迅速發(fā)展的階段。目前大多數(shù)嵌入式系統(tǒng)還孤立于 Internet 之外,但隨著 Internet 的發(fā)展以及 Internet 技術(shù)與信息家電、工業(yè)控制技術(shù)等結(jié)合日益密切,嵌入式設(shè)備與 Internet 的結(jié)合將代表著嵌入式技術(shù)的真正未來。
3. 使用實時操作系統(tǒng)的必要性
嵌入式實時操作系統(tǒng)在目前的嵌入式應(yīng)用中用得越來越廣泛,尤其在功能復(fù)雜、系統(tǒng)龐大的應(yīng)用中顯得愈來愈重要。
首先,嵌入式實時操作系統(tǒng)提高了系統(tǒng)的可靠性。在控制系統(tǒng)中,出于安全方面的考慮,要求系統(tǒng)起碼不能崩潰,而且還要有自愈能力。不僅要求在硬件設(shè)計方面提高系統(tǒng)的可靠性和抗干擾性,而且也應(yīng)在軟件設(shè)計方面提高系統(tǒng)的抗干擾性,盡可能地減少安全漏洞和不可靠的隱患。長期以來的前后臺系統(tǒng)軟件設(shè)計在遇到強干擾時,使得運行的程序產(chǎn)生異常、出錯、跑飛,甚至死循環(huán),造成了系統(tǒng)的崩潰。而實時操作系統(tǒng)管理的系統(tǒng),這種干擾可能只是引起若干進程中的一個被破壞,可以通過系統(tǒng)運行的系統(tǒng)監(jiān)控進程對其進行修復(fù)。通常情況下,這個系統(tǒng)監(jiān)視進程用來監(jiān)視各進程運行狀況,遇到異常情況時采取一些利于系統(tǒng)穩(wěn)定可靠的措施,如把有問題的任務(wù)清除掉。從某種意義上說,沒有操作系統(tǒng)的計算機 ( 裸機 ) 是沒有用的。在嵌入式應(yīng)用中,只有把 CPU 嵌入到系統(tǒng)中,同時又把操作系統(tǒng)嵌入進去,才是真正的計算機嵌入式應(yīng)用。
4. 實時操作系統(tǒng)的優(yōu)缺點
在嵌入式實時操作系統(tǒng)環(huán)境下開發(fā)實時應(yīng)用程序使程序的設(shè)計和擴展變得容易,不需要大的改動就可以增加新的功能。通過將應(yīng)用程序分割成若干獨立的任務(wù)模塊,使應(yīng)用程序的設(shè)計過程大為簡化;而且對實時性要求苛刻的事件都得到了快速、可靠的處理。通過有效的系統(tǒng)服務(wù),嵌入式實時操作系統(tǒng)使得系統(tǒng)資源得到更好的利用。
【嵌入式C語言優(yōu)化技巧】相關(guān)文章:
嵌入式C語言優(yōu)化小技巧10-01
C語言優(yōu)化小技巧09-20
嵌入式C語言性能優(yōu)化方法03-27
嵌入式C語言內(nèi)存操作技巧09-07
嵌入式c語言調(diào)試開關(guān)的技巧09-28
c語言優(yōu)化階段10-05
嵌入式C語言學習秘訣03-27
C語言嵌入式編程小知識09-05