娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月09日(星期三)

正在發生

2018年10月09日 | 有這10個關鍵點,在ARM下高效C編程沒問題!

發布者:快樂的天使 來源: eefocus關鍵字:ARM  C編程 手機看文章 掃描二維碼
隨時隨地手機看文章

通過一定的方法來編寫C程序,可以幫助C編譯器生成執行速度更快的ARM代碼。下面就是一些與性能相關的關鍵點:

1.對局部變量、函數參數和返回值要使用signed和unsigned int類型。這樣可以避免類型轉換,而且可高效地使用ARM的32位數據操作指令。

2.最高效的循環體形式是減計數到零(counts down to zero)的do-while循環。

3.展開重要的循環來減少循環的開銷。

4.不要依賴編譯器來優化掉重復的存儲器訪問。指針別名會阻止編譯器的這種優化。

5.盡可能把函數參數的個數限制在4個以內。如果函數參數都存放在寄存器內,那么函數調用就會快得多。

6.按元素尺寸從小到大排列的方法來安排結構體,特別是在thumb模式下編譯。

7.不要使用位域,可以用掩碼和邏輯操作來替代。

8.避免除法,可以用倒數的乘法來替代。

9.避免邊界不對齊的數據。如果數據有可能邊界不對齊,那么就要使用char *指針類型來訪問。

10.在C編譯器中使用內嵌匯編可以利用到C編譯器本來不支持的指令或優化。

一、 數據類型使用上的優化

1.局部變量
一個char類型的數據比int類型的數據占用更小的寄存器空間或者更小的ARM堆棧空間。這兩種設想對于ARM來說,都是錯誤的。所有的ARM寄存器都是32位的,所有的堆棧入口至少是32位的。當我們執行i ,要利用當i=255后,i =0這個條件時,可以把它定義為char類型。

2.函數參數
盡管寬和窄的函數調用規則各有其優點,但char或short類型的函數參數和返回值都會產生額外的開銷,導致性能的下降,并增加了代碼尺寸。所以,即使是傳輸一個8位的數據,函數參數和返回值使用int類型也會更有效。

總結:

1)對于存放在寄存器中的局部變量,除了8位或16位的算術模運算外,盡量不要使用char和short類型,而要使用有符號或無符號int類型。除法運算時使用無符號數執行速度更快。

2)對于存放在主存儲器中的數組和全局變量,在滿足數據大小的前提下,應盡可能使用小尺寸的數據類型,這樣可以節省存儲空間。ARMv4體系結構可以有效地裝載和存儲所有寬度的數據,并可以使用遞增數組指針來有效地訪問數組。對于short類型數組,要避免使用數組基地址的偏移量,因為LDRH指令不支持偏移尋址。

3)通過讀取數組或全局變量并賦給不同類型的局部變量時,或者把局部變量寫入不同類型的數組或者全局變量時,要進行顯式數據類型轉換。這種轉換使編譯器可以明確、快速地處理,把存儲器中數據寬度比較窄的數據類型擴展,并賦給寄存器中較寬的類型。

4)由于隱式或者顯式的數據類型轉換通常會有額外的指令周期開銷,所以在表達式中應盡量避免使用。Load和store指令一般不會產生額外的轉換開銷,因為load和store指令是自動完成數據類型轉換的。

5)對于函數參數和返回值應盡量避免使用char和short類型。即使參數范圍比較小,也應該使用int類型,以防止編譯器做不必要的類型轉換。

二、C循環結構

在ARM上,一個循環其實只要2條指令就足夠了:

一條減法指令,進行循環減法計數,同時設置結果的條件標志;
一條條件分支指令。

這里的關鍵是,循環的終止條件應為減計數到零,而不是計數增加到某個特定的限制值。由于減計數結構已存儲在條件標志里,與零比較的指令就可以省略了。由于不用i作為數組的下標索引,采用減計數就沒有任何問題了。

總而言之,無論對于有符號的循環計數值,都應使用i!=0作為循環的結束條件。對有符號數i,這比使用條件i>0少了一條指令。

總結:
1) 使用減計數到零的循環結構,這樣編譯器就不需要分配一個寄存器來保存循環終止值,而且與0比較的指令也可以省略。

2) 使用無符號的循環計數值,循環繼續的條件為i!=0而不是i>0,這樣可以保證循環開銷只有兩條指令。

3) 如果事先知道循環體至少會執行一次,那么使用do-while循環要比for循環要好,這樣可以使編譯器省去檢查循環計數值是否為零的步驟。

4) 展開重要的循環體可降低循環開銷,但不要過度展開,如果循環的開銷對整個程序來說占的比例很小,那么循環展開反而會增加代碼量并降低cache的性能。

5) 盡量使數組的大小是4或8的倍數,這樣可以容易的以2,4,8次等多種選擇展開循環,而不需要擔心剩余數組元素的問題。

三、寄存器分配

高效的寄存器分配:應該盡量限制函數內部循環所用局部變量的數目,最多不超過12個,這樣,編譯器就可以把這些變量都分配給ARM寄存器。

四、函數調用

4寄存器規則:帶有4個或者更少參數的函數,要比多于4個參數的函數執行效率高得多。對帶有少于4個參數的函數來說,編譯器可以用寄存器傳遞所有的參數;而對于多于4個參數的函數,函數調用者和被調用者必須通過訪問堆棧來傳遞一些參數。

如果函數體積很小,只用到很少的寄存器,那么還有一些其他的方法來減少函數調用的開銷。可以把調用函數和被調用函數放在同一個C文件中,這樣編譯器就知道了被調用函數生成的代碼,并以此對調用函數進行一些優化。

總結:
1) 盡量限制函數的參數,不要超過4個,這樣函數調用的效率會更高。也可以將幾個相關的參數組織在一個結構體中,用傳遞結構體指針來代替多個參數。
2) 把比較小的被調用函數和調用函數放在同一個源文件中,并且要先定義,后調用,編譯器就可以優化函數調用或者內聯較小的函數。
3) 對性能影響較大的重要函數可使用關鍵字_inline進行內聯。

五、指針別名

定義:當2個指針指向同一個地址對象時,這2個指針被稱作該對象的別名(alias)。如果對其中一個指針進行寫入,就會影響從另一個指針的讀出。在一個函數中,編譯器通常不知道哪一個指針是別名,哪一個不是;或哪一個指針有別名,哪一個沒有。

避免指針別名:
1) 不要依賴編譯器來消除包含存儲器訪問的公共子表達式,而應建立一個新的局部變量來保存這個表達式的值,這樣可以保證只對這個表達式求一次值;
2) 避免使用局部變量的地址,否則對這個變量的訪問效率會比較低。

六、結構體安排

在ARM上使用結構體有2個問題需要考慮:結構體地址邊界對齊和結構體總的大小。

獲得高效結構體的原則:
1) 把所有8位大小的元素安排在結構體的前面;
2) 以此安排16位、32位和64位的元素;
3) 把所有數組和比較大的元素安排在結構體最后;
4) 對于一條指令,如果結構體太大而不能訪問所有的元素,那么把元素組織到一個子結構體中。編譯器可以維持單獨的子結構體的指針。

總結:
結構體元素要按照元素的大小來排列,以最小的元素放在開始,最大的元素安排在最后;避免使用很大的結構體,可以用層次化的小結構體來代替;為了提高可移植性,人工對API的結構體增加填充位,這樣,結構體的安排將不會依賴與編譯器;在API的結構體中要謹慎使用枚舉類型。一個枚舉類型的大小是編譯器相關的。

七、位域

注意事項:
1) 應避免使用位域,而使用#define或者enum來定義屏蔽位;
2) 使用整型邏輯運算AND、OR、“異或”操作和屏蔽對位域進行測試、取反和設置操作。這些操作編譯效率高,還可以同時對多個位域進行測試、取反和設置。

八、邊界不對齊數據和字節排列方式(大/小端)

邊界不對齊數據和字節排列方式這2個問題,可使內存訪問和移植問題復雜化。須考慮數組指針是否邊界對齊,ARM配置是大端(big-endian),還是小端(little-endian)的存儲器系統。

總結:
1) 盡量避免使用邊界不對齊的數據;
2) 使用類型char *可指向任意字節邊界的數據。通過讀字節來訪問數據,使用邏輯操作來組合數據,這樣代碼就不會依賴于邊界是否對齊或者ARM的字節排列方式的配置;
3) 為了快速訪問邊界不對齊的結構體,可以根據指針邊界和處理器的字節排序方式寫出不同的程序變體。

九、除法

ARM硬件上不支持除法指令,當代碼中出現除法運算時,ARM編譯器會調用C庫函數(有符號的除法調用_rt_sdiv,無符號的調用_rt_udiv),來實現除法操作。有許多不同類型的除法程序來適應不同的除數和被除數。

總結:
1) 盡可能避免使用除法。對環形緩沖區的處理可以不用除法。

2) 如果不能避免除法運算,那么盡可能考慮使用除法程序同時產生商n/d和余數n%d的好處。

3) 對于重復對同一除數d的除法,預先計算好s=(2k-1)/d。可用乘以s的2k位乘法來代替除以d的k位無符號整數除法。

4)使用2的整數次冪作除數。當2的整數次冪做除數時,編譯器會自動將除法運算轉換成移位運算。所以在編寫程序算法時,盡量使用2的整數次冪做除數。

5)求余運算。可以將一些典型的求余運算進行轉換,以避免在程序中使用除法運算。

如:

uint counter1(uint count)
{
return ( count`);
}
轉換成:
uint counter2(uint count)
{
if ( count >=60)
count=0;
return (count);
}

大多數ARM處理器硬件上并不支持浮點運算。這樣在一個對價格敏感的嵌入式應用系統中,可節省空間和降低功耗。除了硬件向量浮點累加器VFP和ARM7500FE上的浮點累加器FPA外,C編譯器必須在軟件上提供浮點支持。

十、內聯函數和內嵌匯編

高效地調用函數,使用內聯函數可以完全去除函數調用的開銷,另外許多編譯器允許在C源程序中使用內嵌匯編。使用包含匯編的內嵌函數,可以使編譯器支持通常不能有效使用的ARM指令和優化方法。

內聯函數和內嵌匯編最大的好處是,可以實現一些在C語言部分中通常難以完成的操作。使用內聯函數要比使用#define宏定義更好,因為后者不檢查函數參數和返回值的類型。


關鍵字:ARM  C編程 引用地址:有這10個關鍵點,在ARM下高效C編程沒問題!

上一篇:STM32F407之TF卡HAL庫的使用
下一篇:單片機、ARM、FPGA嵌入式這些有什么區別,各自特點是什么?

推薦閱讀

東京工業大學遠藤玄副教授等的研究團隊近日新開發一種可搬運重物的輕型四腳機器人。關節處的鋼絲采用化學,同時實現機器的輕便化與高功率,與同等重量的機器人相比可達約3倍的輸出功率。在房屋坍塌的受災現場等崎嶇不平的路面上,該機器可自如行走,幫助搬運救援物資和現場搜救。研究團隊計劃將進一步明確用途,推進改良,早日投入實際運用。 新開發的...
日本國內工廠在物聯網大潮中動作遲緩,原因之一是數十萬臺早已停止支持服務的老舊電腦仍在運行。《日本經濟新聞》網站29日詳細描述了“日本制造”面臨的這個新難題。報道稱,在位于千葉縣松戶市的電腦專修店,大量來自日本各地的老式電腦被送來修理。據稱,該店每個月接到的咨詢超過100件,店內擺滿仍在使用“Windows 95”等老式操作系統的電腦。該店負責...
9月4日,路透社轉引日本經濟新聞報道,日本索尼公司和存儲芯片制造商鎧俠(Kioxia Holdings Corp)正在向美國商務部積極申請華為供貨許可。如果此消息得到確認,索尼和鎧俠將緊隨各大芯片制造商申請向華為供貨許可的步伐。據各大媒體此前的報道,其中英特爾和AMD的華為供貨許可已經申請成功。目前中美關系處于數十年來的低谷期,華盛頓方面最近兩年來出...
紋波是電源的核心指標,但如何準確測量紋波卻是一個被廣泛忽略的問題。也許您認為不就是示波器交流耦合,然后把探頭點在電源上嗎?事實遠非如此,這里普科科技PRBTEK將為您呈現紋波測試的正確方式。一、探頭的選擇在十幾年前,很多公司的電源測試標準中都有明確的規定,要求使用1:1 探頭進行測量。因為這種探頭不會損失示波器的測量檔位,比如示波器原來...

史海拾趣

問答坊 | AI 解惑

2006年湖北省電子設計大賽題目:智能搬運車

本帖最后由 paulhyde 于 2014-9-15 03:55 編輯 題目見附件  …

查看全部問答∨

單片機與單片機之間的串口通信

本帖最后由 paulhyde 于 2014-9-15 08:57 編輯 單片機與單片機之間的串口通信  …

查看全部問答∨

手機設計基本知識

本帖最后由 jameswangsynnex 于 2015-3-3 20:03 編輯 哈工大教程ppt 目錄 數字手機原理框圖 手機供電系統框圖 gsm手機設計 cdma手機設計 手機功率放大器設計 感謝哈工大資源 …

查看全部問答∨

想做個stk菜單高人來幫幫忙

俺搞單片機的,以前沒接觸過sim卡,現在要在一種叫CIU5180的51智能卡上做個stk菜單,無從下手。 在eeworld上看了1天資料,只了解各皮毛,這里請教給位大大了。 這樣不可以不:首先做個初始化,接收,發送的程程序。卡上電后,初始化通信,設置波 ...…

查看全部問答∨

兩個單片機用串口通訊

可不可以將兩個單片機的串口直接連接在一起進行通信? 我用的是MSP430,該單片機上有串口模塊,我直接將兩個單片機的串口連接在一起,從一個單片機發信息給另外一個單片機。 但是好像數據沒有成功發送出去,因為另外一個單片機上沒有接收到數據。 ...…

查看全部問答∨

請問CE下有沒有類似于win32下的dbgView這樣的工具?

我現在要在一個板子上開發驅動,但是這個板子不能和電腦進行串口或網絡連接,只能通過SD卡把程序拷貝上去運行來看結果如何? 請問CE下有沒有類似于win32下的dbgView這樣的工具,能夠顯示調試信息。…

查看全部問答∨

在線等待!單片機上電后,IO口與地相連!

如題。我的單片機一上電,就出現地和IO口相連的情況,沒加點時則沒有相連...這是為什么呢?哪位能幫我分析一下嗎?…

查看全部問答∨

汽車電子防盜跟蹤系統工作原理及應用

目前,汽車被盜的情況時有發生,給車輛導航的也是借助于GPS 的定位顯示器,它只需接收24顆地球同步衛星中的兩顆以上(越多越精確)就可以顯示出當前車輛的位置,但它只能接受信息而沒有發射功能,故對于防盜沒有作用。本設備使用簡便,閉合W1,車主 ...…

查看全部問答∨

貼片元件的手工焊接技巧

現在越來越多的電路板采用表面貼裝元件,同傳統的封裝相比,它可以減少電路板的面積,易于大批量加工,布線密度高。貼片電阻和電容的引線電感大大減少,在高頻電路中具有很大的優越性。表面貼裝元件的不方便之處是不便于手工焊接。為此,本文以常見 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 湄潭县| 佛教| 汝州市| 新田县| 若尔盖县| 宽甸| 凤翔县| 安国市| 莆田市| 蕉岭县| 南郑县| 东城区| 通河县| 韶山市| 兴业县| 砚山县| 阜康市| 嘉义市| 时尚| 沽源县| 霸州市| 商都县| 金湖县| 塔河县| 虎林市| 伊金霍洛旗| 临颍县| 南漳县| 信丰县| 桦南县| 怀柔区| 嘉峪关市| 耒阳市| 平定县| 墨竹工卡县| 大庆市| 吉隆县| 平果县| 大石桥市| 佛教| 方城县|