国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C語言嵌入系統(tǒng)編程修煉-性能優(yōu)化

2019-11-17 05:05:29
字體:
供稿:網(wǎng)友
使用宏定義

  在C語言中,宏是產(chǎn)生內(nèi)嵌代碼的唯一方法。對(duì)于嵌入式系統(tǒng)而言,為了能達(dá)到性能要求,宏是一種很好的代替函數(shù)的方法。

  寫一個(gè)"標(biāo)準(zhǔn)"宏MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè):

  錯(cuò)誤做法:

  

  #define MIN(A,B)  ( A <= B ? A : B )

  正確做法:

  

  #define MIN(A,B) ((A)<= (B) ? (A) : (B) )

  對(duì)于宏,我們需要知道三點(diǎn):

  (1)宏定義"像"函數(shù);

  (2)宏定義不是函數(shù),因而需要括上所有"參數(shù)";

  (3)宏定義可能產(chǎn)生副作用。

  下面的代碼:

  

  least = MIN(*p++, b);

  將被替換為:

  

  ( (*p++) <= (b) ?(*p++):(b) )

  發(fā)生的事情無法預(yù)料。

  因而不要給宏定義傳入有副作用的"參數(shù)"。
更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或 使用寄存器變量

  當(dāng)對(duì)一個(gè)變量頻繁被讀寫時(shí),需要反復(fù)訪問內(nèi)存,從而花費(fèi)大量的存取時(shí)間。為此,C語言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時(shí),不需要訪問內(nèi)存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說明符是register。
對(duì)于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計(jì)數(shù)是應(yīng)用寄存器變量的最好候選者。

  (1) 只有局部自動(dòng)變量和形參才可以定義為寄存器變量。因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲(chǔ)方式,凡需要采用靜態(tài)存儲(chǔ)方式的量都不能定義為寄存器變量,包括:模塊間全局變量、模塊內(nèi)全局變量、局部static變量;

  (2) register是一個(gè)"建議"型要害字,意指程序建議該變量放在寄存器中,但最終該變量可能因?yàn)闂l件不滿足并未成為寄存器變量,而是被放在了存儲(chǔ)器中,但編譯器中并不報(bào)錯(cuò)(在C++語言中有另一個(gè)"建議"型要害字:inline)。

  下面是一個(gè)采用寄存器變量的例子:

  

  /* 求1+2+3+….+n的值 */

  Word Addition(BYTE n)

  {

   register i,s=0;

   for(i=1;i<=n;i++)

   {

    s=s+i;

   }

   return s;

  }

  本程序循環(huán)n次,i和s都被頻繁使用,因此可定義為寄存器變量。
更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  Java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或 內(nèi)嵌匯編


  程序中對(duì)時(shí)間要求苛刻的部分可以用內(nèi)嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發(fā)和測(cè)試匯編代碼是一件辛勞的工作,它將花費(fèi)更長(zhǎng)的時(shí)間,因而要慎重選擇要用匯編的部分。

  在程序中,存在一個(gè)80-20原則,即20%的程序消耗了80%的運(yùn)行時(shí)間,因而我們要改進(jìn)效率,最主要是考慮改進(jìn)那20%的代碼。

  嵌入式C程序中主要使用在線匯編,即在C程序中直接插入_asm{ }內(nèi)嵌匯編語句:

  

  /* 把兩個(gè)輸入?yún)?shù)的值相加,結(jié)果存放到另外一個(gè)全局變量中 */

  int result;

  void Add(long a, long *b)

  {

   _asm

   {

    MOV AX, a

    MOV BX, b

    ADD AX, [BX]

    MOV result, AX

   }

  }

  
 
更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  Java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或 利用硬件特性

  首先要明白CPU對(duì)各種存儲(chǔ)器的訪問速度,基本上是:

  

  CPU內(nèi)部RAM > 外部同步RAM > 外部異步RAM > Flash/ROM

  對(duì)于程序代碼,已經(jīng)被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執(zhí)行,但通常這不是一個(gè)好辦法,我們最好在系統(tǒng)啟動(dòng)后將FLASH或ROM中的目標(biāo)代碼拷貝入RAM中后再執(zhí)行以提高取指令速度;

  對(duì)于UART等設(shè)備,其內(nèi)部有一定容量的接收BUFFER,我們應(yīng)盡量在BUFFER被占滿后再向CPU提出中斷。例如計(jì)算機(jī)終端在向目標(biāo)機(jī)通過RS-232傳遞數(shù)據(jù)時(shí),不宜設(shè)置UART只接收到一個(gè)BYTE就向CPU提中斷,從而無謂浪費(fèi)中斷處理時(shí)間;

  假如對(duì)某設(shè)備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標(biāo)中包含的存儲(chǔ)信息較大時(shí)效率較高,其數(shù)據(jù)傳輸?shù)幕締挝皇菈K,而所傳輸?shù)臄?shù)據(jù)是從設(shè)備直接送入內(nèi)存的(或者相反)。DMA方式較之中斷驅(qū)動(dòng)方式,減少了CPU 對(duì)外設(shè)的干預(yù),進(jìn)一步提高了CPU與外設(shè)的并行操作程度。 更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  Java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或 活用位操作

  使用C語言的位操作可以減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用"位運(yùn)算"來完成所有的運(yùn)算和操作,因而,靈活的位操作可以有效地提高程序運(yùn)行的效率。舉例如下:
  

  /* 方法1 */

  int i,j;

  i = 879 / 16;

  j = 562 % 32;

  /* 方法2 */

  int i,j;

  i = 879 >> 4;

  j = 562 - (562 >> 5 << 5);

  對(duì)于以2的指數(shù)次方為"*"、"/"或"%"因子的數(shù)學(xué)運(yùn)算,轉(zhuǎn)化為移位運(yùn)算"<< >>"通常可以提高算法效率。因?yàn)槌顺\(yùn)算指令周期通常比移位運(yùn)算大。


  C語言位運(yùn)算除了可以提高運(yùn)算效率外,在嵌入式系統(tǒng)的編程中,它的另一個(gè)最典型的應(yīng)用,而且十分廣泛地正在被使用著的是位間的與(&)、或(?。?、非(~)操作,這跟嵌入式系統(tǒng)的編程特點(diǎn)有很大關(guān)系。我們通常要對(duì)硬件寄存器進(jìn)行位設(shè)置,譬如,我們通過將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設(shè)置為0(開中斷2),最通用的做法是:

  #define INT_I2_MASK 0x0040

  wTemp = inword(INT_MASK);

  outword(INT_MASK, wTemp &~INT_I2_MASK);

  而將該位設(shè)置為1的做法是:

  

  #define INT_I2_MASK 0x0040

  wTemp = inword(INT_MASK);

  outword(INT_MASK, wTemp   INT_I2_MASK);

  判定該位是否為1的做法是:

  

  #define INT_I2_MASK 0x0040

  wTemp = inword(INT_MASK);

  if(wTemp & INT_I2_MASK)

  {

  … /* 該位為1 */

  }

  上述方法在嵌入式系統(tǒng)的編程中是非經(jīng)常見的,我們需要牢固把握。
更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  Java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或 總結(jié)

  在性能優(yōu)化方面永遠(yuǎn)注重80-20預(yù)備,不要優(yōu)化程序中開銷不大的那80%,這是勞而無功的。

  宏定義是C語言中實(shí)現(xiàn)類似函數(shù)功能而又不具函數(shù)調(diào)用和返回開銷的較好方法,但宏在本質(zhì)上不是函數(shù),因而要防止宏展開后出現(xiàn)不可預(yù)料的結(jié)果,對(duì)宏的定義和使用要慎而處之。很遺憾,標(biāo)準(zhǔn)C至今沒有包括C++中inline函數(shù)的功能,inline函數(shù)兼具無調(diào)用開銷和安全的優(yōu)點(diǎn)。

  使用寄存器變量、內(nèi)嵌匯編和活用位操作也是提高程序效率的有效方法。

  除了編程上的技巧外,為提高系統(tǒng)的運(yùn)行效率,我們通常也需要最大可能地利用各種硬件設(shè)備自身的特點(diǎn)來減小其運(yùn)轉(zhuǎn)開銷,例如減小中斷次數(shù)、利用DMA傳輸方式等。 更多文章 更多內(nèi)容請(qǐng)看C/C++進(jìn)階技術(shù)文檔  Java編程開發(fā)手冊(cè)  系統(tǒng)安全設(shè)置專題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 冕宁县| 吉首市| 迁安市| 麦盖提县| 巫山县| 铅山县| 光泽县| 延安市| 乌鲁木齐市| 沧州市| 东海县| 开封市| 广昌县| 苍梧县| 砚山县| 施秉县| 乐亭县| 海口市| 越西县| 鹤峰县| 尚义县| 香港 | 军事| 廉江市| 涿鹿县| 齐齐哈尔市| 久治县| 高雄市| 霍邱县| 平武县| 刚察县| 邯郸市| 土默特右旗| 沙湾县| 石狮市| 水城县| 方城县| 三江| 上栗县| 图木舒克市| 周口市|