999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式C語言程序設計中的代碼優化

2010-01-01 00:00:00王志春
電腦知識與技術 2010年1期

摘要:針對嵌入式系統的特點,介紹了幾種在嵌入式系統程序設計中優化C語言代碼的方法,從而提高系統的性能。

關鍵詞:嵌入式系統;C語言;代碼優化

中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)01-126-02

The Code Optimization in Embedded Programing with C Language

WANG Zhi-chun

(Department of Computer, Hexi University, Zhangye 734000, China)

Abstract: According to the characteristics of embedded system, the paper introduced ways of c language code optimization in embedded system design so as to enhance the performance of the system.

Key words: embedded system; c language; code optimization

嵌入式系統是軟件和硬件的緊密結合,具有軟件代碼小、高度自動化、響應速度快等特點。在嵌入式系統中開發高效率的程序涉及很多方面,如編程風格、算法設計、目標優化等,尤其是嵌入式高級語言的編程要結合軟硬件開發環境,使得其軟件受時間和空間的嚴格限制,加上運行環境復雜,使得嵌入式系統軟件的開發變得異常困難。嵌入式系統C語言編程中適當的使用相關技巧,可以優化代碼,提高程序的執行效率。

1 變量定義

在聲明變量時,把相同類型的變量放在一起定義,可以優化內存。如下列定義的4個變量形式一樣,次序不同確導致了不同的數據布局。如圖1所示,顯然第二種方式節約了更多的儲存空間。

對于局部變量的定義,一般情況下使用short或char定義變量,可以節省空間;但局部變量數目有限時,結果相反。因為編譯器會把局部變量分配給內部寄存器,每個變量占用一個寄存器。如圖2所示,32位int變量最快,只用一條加法指令,而8位和16位變量,完成加法后,還需要在32位的寄存器中進行加法擴展。所以使用32位int或unsigned int局部變量最有效率。

2 適當的使用宏

在嵌入式系統中,當函數較短而傳遞參數較多的情況下,為了能達到性能要求,宏是一種很好的代替函數的方法。在C語言中宏是產生內嵌代碼的唯一方法,是實現類似函數功能而又不具函數調用和返回開銷的較好方法,但宏在本質上不是函數,因而要防止宏展開后出現不可預料的結果,對宏的定義和使用要慎而處之。

由于宏只是簡單的替換,宏的參數如果是復合結構,那么通過替換之后可能由于各個參數之間的操作符優先級高于單個參數內部各部分之間相互作用的操作符優先級,如果我們不用括號保護各個宏參數,可能會產生預想不到的情形。比如:

#define ceil_div(x, y) (x + y - 1) / y

a = ceil_div( b c, sizeof(int) );

將被轉化為:

a = ( b c + sizeof(int) - 1) / sizeof(int);

// 由于+/-的優先級高于的優先級,那么上面式子等同于:

a = ( b (c + sizeof(int) - 1)) / sizeof(int);

這顯然不是調用者的初衷。為了避免這種情況發生,應當多寫幾個括號:

#define ceil_div(x, y) (((x) + (y) - 1) / (y))

比如:宏在展開的時候對其參數可能進行多次取值,但是如果這個宏參數是一個函數,那么就有可能被調用多次從而達到不一致的結果,甚至會發生更嚴重的錯誤。比如:

#define min(X,Y) ((X) > (Y) ? (Y) : (X))

c = min(a,foo(b));

這時foo()函數就被調用了兩次。為了解決這個潛在的問題,我們應當這樣寫min(X,Y)這個宏:

#define min(X,Y) ({

typeof (X) x_ = (X);

typeof (Y) y_ = (Y);

(x_ < y_) ? x_ : y_; })

({...})的作用是將內部的幾條語句中最后一條的值返回,它也允許在內部聲明變量(因為它通過大括號組成了一個局部范圍)。

3 循環條件

計數循環是程序中常用的控制結構,在C語言中經常用累加計數或遞減計數的循環形式,這兩種循環形式在邏輯上并沒有效率差異,但映射到具體的體系結構中時,就產生了很大的不同。如圖3所示,累加計數比遞減計數多用一條指令。因為進行一個非0常數比較時,需用CMP指令執行;而當一個變量與0比較時,ARM指令可直接利用條件執行的特性(NE)來判別,所以當循環次數較大時,在性能上就會產生明顯的差異。因此盡量使用遞減計數設置循環條件。

4 活用位操作

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

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

C語言位運算除了可以提高運算效率外,在嵌入式系統的編程中,它的另一個最典型的應用是使用位間的與()、或(|)、非(~)操作對硬件寄存器進行位設置。

5 內嵌匯編

程序中對時間要求苛刻的部分可以用內嵌匯編處理,即在C程序中直接插入_asm{ }內嵌匯編語句,以帶來速度上的顯著提高。但是,開發和測試匯編代碼是一件辛苦的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。

C程序能夠與匯編程序實現方便靈活的接口,在C程序中調用匯編十分方便靈活,對二者調用的主要難度在于:實現數據的準確傳輸。為了使單獨編譯的C語言程序和匯編語言程序能相互調用,定義了統一的函數過程調用標準ATPCS(ARM-Thumb Procedure Call Standard)。ATPCS定義了寄存器組中的R0~R3作為參數傳遞和結果返回寄存器。如果數目超過4個,則使用堆棧傳遞。因為內部寄存器的訪問速度遠遠大于存儲器,所以盡量使參數傳遞在寄存器中進行,即盡量把函數的參數控制在4個以下。

6 利用硬件特性

由于CPU對各種存儲器的訪問速度是不同的,其速度基本上是:

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

對于程序代碼,已經被燒錄在FLASH或ROM中,我們最好在系統啟動后將FLASH或ROM中的目標代碼拷貝入RAM中后再執行以提高取指令速度;對于UART等設備,其內部有一定容量的接收BUFFER,我們應盡量在BUFFER被占滿后再向CPU提出中斷,從而避免浪費中斷處理時間;如果對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時效率較高,其數據傳輸的基本單位是塊,而所傳輸的數據是從設備直接送入內存的(或者相反)。DMA方式較之中斷驅動方式,減少了CPU 對外設的干預,進一步提高了CPU與外設的并行操作程度。

7 結束語

總的來說,代碼的優化和編譯器、硬件結構有關。在使用這些技術提高代碼運行速度的同時,相應的也會產生一些負面的影響,比如增加代碼的大小、降低程序可讀性等。因此在進行代碼優化前要進行系統性能分析和評估,根據系統的實際需要,合理地運用上面介紹的一種或多種技術優化代碼,提高代碼的效率,以達到最佳的優化效果。

參考文獻:

[1] 田澤.嵌入式系統開發與應用教程[M].北京:北京航空航天大學出版社,2005.

[2] 田曉梅,王月姣.嵌入式C語言在工程編程中的應用技巧[J].中南民族大學學報:自然科學版,2005(1).

[3] 吳俊軍,劉東升.S3FC9DC單片機代碼優化技術研究[J].微計算機信息,2007(8).

[4] 李石晶.關于嵌入式系統代碼優化的一些體會[J].中國新通信,2007(11).

[5] 劉曉升.使用C語言編寫高效嵌入式軟件的教學探討[J].計算機教育,2008(18).

主站蜘蛛池模板: 青青青国产视频手机| 少妇极品熟妇人妻专区视频| 亚洲欧洲美色一区二区三区| 伊人色在线视频| 国产乱子伦手机在线| 久久香蕉国产线| 全部无卡免费的毛片在线看| 免费一级成人毛片| 国产在线精品网址你懂的| 欧美午夜小视频| 色成人亚洲| 114级毛片免费观看| 亚洲第一成人在线| 狠狠色噜噜狠狠狠狠奇米777| 久久精品国产电影| 777午夜精品电影免费看| 茄子视频毛片免费观看| 国产精品自拍合集| 国产电话自拍伊人| 亚洲无线一二三四区男男| 久久 午夜福利 张柏芝| AV色爱天堂网| 四虎国产永久在线观看| 欧美成人影院亚洲综合图| 真实国产乱子伦视频| 97se亚洲综合在线天天| 欧美性精品不卡在线观看| 青青草91视频| 久久婷婷六月| a在线观看免费| 国产在线视频福利资源站| 国产真实自在自线免费精品| 99久久性生片| 找国产毛片看| AV网站中文| 国产区在线看| 国产高清精品在线91| 成人国产精品2021| 亚洲 日韩 激情 无码 中出| 中文字幕在线看| 婷婷六月综合网| 69综合网| 国产网站一区二区三区| 日韩东京热无码人妻| 黄片在线永久| 99re66精品视频在线观看 | 国产sm重味一区二区三区| 99热线精品大全在线观看| 日韩毛片免费视频| 五月天在线网站| 日本免费a视频| 免费不卡在线观看av| 亚洲成人www| 在线色国产| 国产欧美日韩va| 久久综合九色综合97网| 国产免费高清无需播放器| 国产精品女在线观看| 综合天天色| 日本高清在线看免费观看| A级全黄试看30分钟小视频| 欧美精品xx| 一本无码在线观看| 欧美综合一区二区三区| 片在线无码观看| 久久这里只有精品66| 99视频全部免费| 久久成人18免费| 一区二区影院| 99精品影院| 日韩av手机在线| 亚洲看片网| 日日拍夜夜操| 欧美劲爆第一页| 亚洲天堂网在线视频| 视频国产精品丝袜第一页| 92午夜福利影院一区二区三区| 婷婷色狠狠干| 欧美日韩精品一区二区视频| 久久夜夜视频| 制服丝袜国产精品| 国产亚洲成AⅤ人片在线观看|