日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

<ol id="5wzwc"></ol>
        <i id="5wzwc"></i>
        當前位置:首頁 > > 嵌入式微處理器
        [導讀]在C語言中,宏是產(chǎn)生內(nèi)嵌代碼的唯一方法。對于嵌入式系統(tǒng)而言,為了能達到性能要求, 宏是一種很好的代替函數(shù)的方法。


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

        使用宏定義

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

        寫一個“標準”宏MIN ,這個宏輸入兩個參數(shù)并返回較小的一個:

        錯誤做法:

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

        正確做法:

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

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

        1. 宏定義“像”函數(shù);

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

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

        下面的代碼:

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

        將被替換為:

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

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

        因而不要給宏定義傳入有副作用的“參數(shù)”。

        使用寄存器變量

        當對一個變量頻繁被讀寫時,需要反復訪問內(nèi)存,從而花費大量的存取時間。為此,C語言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫,從而提高效率。

        寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復使用的變量均可定義為寄存器變量,而循環(huán)計數(shù)是應用寄存器變量的最好候選者。

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

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

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

         1/*?求1+2+3+….+n的值?*/
        2WORD?Addition(BYTE?n)
        3{
        4
        5??register?i,s=0;
        6??for(i=1;i<=n;i++)
        7??{
        8????s=s+i;
        9??}
        10
        11??return?s;
        12}

        本程序循環(huán)n次,i和s都被頻繁使用,因此可定義為寄存器變量。

        內(nèi)嵌匯編

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

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

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

         1/*?把兩個輸入?yún)?shù)的值相加,結(jié)果存放到另外一個全局變量中?*/
        2int?result;
        3void?Add(long?a,?long?*b)
        4{
        5??_asm
        6??{
        7????MOV?AX,?a
        8????MOV?BX,?b
        9????ADD?AX,?[BX]
        10????MOV?result,?AX
        11??}
        12}

        利用硬件特性

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

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

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

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

        如果對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時效率較高,其數(shù)據(jù)傳輸?shù)幕締挝皇菈K,而所傳輸?shù)臄?shù)據(jù)是從設備直接送入內(nèi)存的(或者相反)。DMA方式較之中斷驅(qū)動方式,減少了CPU 對外設的干預,進一步提高了CPU與外設的并行操作程度。

        活用位操作

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

        1/*?方法1?*/
        2int?i,j;
        3i?=?879?/?16;
        4j?=?562?%?32;
        5/*?方法2?*/
        6int?i,j;
        7i?=?879?>>?4;
        8j?=?562?-?(562?>>?5?<

        對于以2的指數(shù)次方為“*”、“/”或“%”因子的數(shù)學運算,轉(zhuǎn)化為移位運算“<< >>”通??梢蕴岣咚惴ㄐ?。因為乘除運算指令周期通常比移位運算大。

        C語言位運算除了可以提高運算效率外,在嵌入式系統(tǒng)的編程中,它的另一個最典型的應用,而且十分廣泛地正在被使用著的是位間的與(&)、或(|)、非(~)操作,這跟嵌入式系統(tǒng)的編程特點有很大關系。

        我們通常要對硬件寄存器進行位設置,譬如,我們通過將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設置為0(開中斷2),最通用的做法是:

        1#define?INT_I2_MASK?0x0040
        2
        3wTemp?=?inword(INT_MASK);
        4outword(INT_MASK,?wTemp?&~INT_I2_MASK);

        而將該位設置為1的做法是:

        1#define?INT_I2_MASK?0x0040
        2wTemp?=?inword(INT_MASK);
        3outword(INT_MASK,?wTemp?|?INT_I2_MASK);

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

        1#define?INT_I2_MASK?0x0040
        2wTemp?=?inword(INT_MASK);
        3if(wTemp?&?INT_I2_MASK)
        4{
        5…?/*?該位為1?*/
        6}

        上述方法在嵌入式系統(tǒng)的編程中是非常常見的,我們需要牢固掌握。

        總結(jié)

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

        宏定義是C語言中實現(xiàn)類似函數(shù)功能而又不具函數(shù)調(diào)用和返回開銷的較好方法,但宏在本質(zhì)上不是函數(shù),因而要防止宏展開后出現(xiàn)不可預料的結(jié)果,對宏的定義和使用要慎而處之。

        很遺憾,標準C至今沒有包括C++中inline函數(shù)的功能,inline函數(shù)兼具無調(diào)用開銷和安全的優(yōu)點。

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

        除了編程上的技巧外,為提高系統(tǒng)的運行效率,我們通常也需要最大可能地利用各種硬件設備自身的特點來減小其運轉(zhuǎn)開銷,例如減小中斷次數(shù)、利用DMA傳輸方式等。

        END

        來源:技術讓夢想更偉大,作者:李肖遙

        版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。

        推薦閱讀

        飛機上一般是什么操作系統(tǒng)?

        高速CAN、容錯CAN、LIN總線有什么區(qū)別?

        大佬終于把鴻蒙OS講明白了,收藏了!

        免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

        嵌入式ARM

        掃描二維碼,關注更多精彩內(nèi)容

        本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
        換一批
        延伸閱讀

        LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

        關鍵字: 驅(qū)動電源

        在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

        關鍵字: 工業(yè)電機 驅(qū)動電源

        LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

        關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

        根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

        關鍵字: LED 設計 驅(qū)動電源

        電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

        關鍵字: 電動汽車 新能源 驅(qū)動電源

        在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

        關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

        LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

        關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

        在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

        關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

        開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

        關鍵字: LED 驅(qū)動電源 開關電源

        LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

        關鍵字: LED 隧道燈 驅(qū)動電源
        關閉