亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言嵌入系統編程修煉-性能優化

2019-11-17 05:05:29
字體:
來源:轉載
供稿:網友
使用宏定義

  在C語言中,宏是產生內嵌代碼的唯一方法。對于嵌入式系統而言,為了能達到性能要求,宏是一種很好的代替函數的方法。

  寫一個"標準"宏MIN ,這個宏輸入兩個參數并返回較小的一個:

  錯誤做法:

  

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

  正確做法:

  

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

  對于宏,我們需要知道三點:

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

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

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

  下面的代碼:

  

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

  將被替換為:

  

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

  發生的事情無法預料。

  因而不要給宏定義傳入有副作用的"參數"。
更多文章 更多內容請看C/C++進階技術文檔  java編程開發手冊  系統安全設置專題,或 使用寄存器變量

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

  (1) 只有局部自動變量和形參才可以定義為寄存器變量。因為寄存器變量屬于動態存儲方式,凡需要采用靜態存儲方式的量都不能定義為寄存器變量,包括:模塊間全局變量、模塊內全局變量、局部static變量;

  (2) register是一個"建議"型要害字,意指程序建議該變量放在寄存器中,但最終該變量可能因為條件不滿足并未成為寄存器變量,而是被放在了存儲器中,但編譯器中并不報錯(在C++語言中有另一個"建議"型要害字:inline)。

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

  

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

  Word Addition(BYTE n)

  {

   register i,s=0;

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

   {

    s=s+i;

   }

   return s;

  }

  本程序循環n次,i和s都被頻繁使用,因此可定義為寄存器變量。
更多文章 更多內容請看C/C++進階技術文檔  Java編程開發手冊  系統安全設置專題,或 內嵌匯編


  程序中對時間要求苛刻的部分可以用內嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發和測試匯編代碼是一件辛勞的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。

  在程序中,存在一個80-20原則,即20%的程序消耗了80%的運行時間,因而我們要改進效率,最主要是考慮改進那20%的代碼。

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

  

  /* 把兩個輸入參數的值相加,結果存放到另外一個全局變量中 */

  int result;

  void Add(long a, long *b)

  {

   _asm

   {

    MOV AX, a

    MOV BX, b

    ADD AX, [BX]

    MOV result, AX

   }

  }

  
 
更多文章 更多內容請看C/C++進階技術文檔  Java編程開發手冊  系統安全設置專題,或 利用硬件特性

  首先要明白CPU對各種存儲器的訪問速度,基本上是:

  

  CPU內部RAM > 外部同步RAM > 外部異步RAM > Flash/ROM

  對于程序代碼,已經被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執行,但通常這不是一個好辦法,我們最好在系統啟動后將FLASH或ROM中的目標代碼拷貝入RAM中后再執行以提高取指令速度;

  對于UART等設備,其內部有一定容量的接收BUFFER,我們應盡量在BUFFER被占滿后再向CPU提出中斷。例如計算機終端在向目標機通過RS-232傳遞數據時,不宜設置UART只接收到一個BYTE就向CPU提中斷,從而無謂浪費中斷處理時間;

  假如對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時效率較高,其數據傳輸的基本單位是塊,而所傳輸的數據是從設備直接送入內存的(或者相反)。DMA方式較之中斷驅動方式,減少了CPU 對外設的干預,進一步提高了CPU與外設的并行操作程度。 更多文章 更多內容請看C/C++進階技術文檔  Java編程開發手冊  系統安全設置專題,或 活用位操作

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

  /* 方法1 */

  int i,j;

  i = 879 / 16;

  j = 562 % 32;

  /* 方法2 */

  int i,j;

  i = 879 >> 4;

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

  對于以2的指數次方為"*"、"/"或"%"因子的數學運算,轉化為移位運算"<< >>"通常可以提高算法效率。因為乘除運算指令周期通常比移位運算大。


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

  #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);

  outword(INT_MASK, wTemp   INT_I2_MASK);

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

  

  #define INT_I2_MASK 0x0040

  wTemp = inword(INT_MASK);

  if(wTemp & INT_I2_MASK)

  {

  … /* 該位為1 */

  }

  上述方法在嵌入式系統的編程中是非經常見的,我們需要牢固把握。
更多文章 更多內容請看C/C++進階技術文檔  Java編程開發手冊  系統安全設置專題,或 總結

  在性能優化方面永遠注重80-20預備,不要優化程序中開銷不大的那80%,這是勞而無功的。

  宏定義是C語言中實現類似函數功能而又不具函數調用和返回開銷的較好方法,但宏在本質上不是函數,因而要防止宏展開后出現不可預料的結果,對宏的定義和使用要慎而處之。很遺憾,標準C至今沒有包括C++中inline函數的功能,inline函數兼具無調用開銷和安全的優點。

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲free性xxxx护士hd| 日韩中文综合网| 亚洲精品福利资源站| 91国自产精品中文字幕亚洲| 伊人激情综合网| 亚洲自拍中文字幕| 亚洲第一av在线| www.亚洲一二| 清纯唯美亚洲综合| 国产91热爆ts人妖在线| 日韩欧美999| 国产精品人成电影在线观看| 亚洲一区二区三区sesese| 91精品国产高清自在线| 久久久久久久久久亚洲| 国产一区二区日韩精品欧美精品| 亚洲欧美在线第一页| 日韩精品中文字| 亚洲xxx自由成熟| 久久久久久com| 日本精品久久久久久久| 亚洲国产精品久久久久| 精品国产成人在线| 亚洲黄色www| 亚洲开心激情网| 激情成人在线视频| 久久色精品视频| 色哟哟入口国产精品| 成人午夜在线观看| 欧美高清一级大片| 粉嫩av一区二区三区免费野| 亚洲国产另类久久精品| 不卡毛片在线看| 欧美黑人一区二区三区| 欧美日韩亚洲一区二区三区| 国产精品久久久一区| 日韩av中文字幕在线| 成人免费黄色网| 日韩欧美中文免费| 亚洲人a成www在线影院| 亚洲色图综合网| 久久99国产综合精品女同| 欧美性极品少妇精品网站| 国产成人在线一区二区| 成人午夜黄色影院| 欧美一级片久久久久久久| 97视频网站入口| 成人激情黄色网| 国产精品一区二区久久久| 在线激情影院一区| 色系列之999| 欧美日韩国产一区中文午夜| 日韩欧美在线观看视频| 中文字幕在线看视频国产欧美在线看完整| 国产一区二区三区中文| 色婷婷av一区二区三区在线观看| 欧美日韩免费网站| 国产日韩欧美在线播放| 亚洲电影免费观看| 91夜夜揉人人捏人人添红杏| 伊人久久男人天堂| 国产精品第3页| 成人午夜一级二级三级| 欧美性猛交99久久久久99按摩| 韩国精品久久久999| 91精品综合久久久久久五月天| 国内偷自视频区视频综合| 欧美激情精品久久久久久黑人| 亚洲**2019国产| 国内外成人免费激情在线视频| 在线观看不卡av| 亚洲色图第三页| 亚洲va欧美va国产综合久久| 国产成人福利视频| 久久91亚洲精品中文字幕| 国产偷亚洲偷欧美偷精品| 日本久久中文字幕| 中文字幕日韩精品有码视频| 国产欧美日韩丝袜精品一区| 日韩成人激情在线| 亚洲美女又黄又爽在线观看| 精品国产欧美一区二区三区成人| 91精品久久久久久久久久久| 成人黄色午夜影院| 欧美日韩性视频| 在线观看日韩视频| 国产精品久久久久久久久久三级| 成人有码在线视频| 亚洲天堂成人在线| 综合136福利视频在线| 亚洲精品一区av在线播放| 久久久精品999| 日韩成人性视频| 欧美亚洲日本网站| 久久影视电视剧免费网站| 国产精品欧美一区二区三区奶水| 浅井舞香一区二区| 日本午夜人人精品| 亚洲国产精品999| 91欧美激情另类亚洲| 九九热r在线视频精品| 亚洲福利在线视频| 欧美一区二区.| 亚洲激情久久久| 欧美激情网友自拍| 国产一区二区久久精品| 欧美国产日韩一区二区| 国产在线拍偷自揄拍精品| 午夜剧场成人观在线视频免费观看| xxx欧美精品| 欧美成人中文字幕在线| 日本中文字幕不卡免费| 精品精品国产国产自在线| 欧美日在线观看| 日韩av黄色在线观看| 欧美丰满少妇xxxxx做受| 韩国精品久久久999| 欧美性生交大片免费| 在线色欧美三级视频| 亚洲国产中文字幕久久网| 综合欧美国产视频二区| 欧美另类在线播放| 成年无码av片在线| 97av在线视频| 亚洲三级av在线| 欧美性视频网站| 7777免费精品视频| 国产精品扒开腿做爽爽爽视频| 精品视频中文字幕| 国产精品露脸自拍| 国产成人高潮免费观看精品| 亚洲午夜小视频| 57pao成人国产永久免费| 欧美风情在线观看| 亚洲第一区在线观看| 亚洲国产古装精品网站| 尤物yw午夜国产精品视频| 久久91亚洲精品中文字幕| 亚洲va欧美va国产综合久久| 日韩亚洲精品电影| 日韩在线视频网站| 久久久久一本一区二区青青蜜月| 欧美黑人xxx| 亚洲综合中文字幕68页| 国产精品丝袜久久久久久高清| 亚洲sss综合天堂久久| 91久久精品国产91久久| 国产成人久久久精品一区| 亚洲精品在线91| 成人有码在线播放| 久色乳综合思思在线视频| 亚洲qvod图片区电影| 成人做爽爽免费视频| 久久亚洲精品视频| 亚洲91精品在线观看| 国产精品综合不卡av| 欧美成人亚洲成人| 国产成人精品免费久久久久| 亚洲综合在线播放| 最近中文字幕mv在线一区二区三区四区| 国产一区二区免费| 色yeye香蕉凹凸一区二区av| 中文字幕日韩精品有码视频| 九九精品在线播放|