亚欧洲精品在线观看,窝窝影院午夜看片,久久国产成人午夜av影院宅,午夜91,免费国产人成网站,ts在线视频,欧美激情在线一区

C語(yǔ)言

嵌入式C語(yǔ)言?xún)?yōu)化技巧

時(shí)間:2025-03-11 07:00:12 松濤 C語(yǔ)言 我要投稿

嵌入式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)?yōu)化小技巧09-09

C語(yǔ)言?xún)?yōu)化小技巧10-04

嵌入式C語(yǔ)言性能優(yōu)化方法10-22

嵌入式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

嵌入式C語(yǔ)言編程知識(shí)總結(jié)06-04