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