<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM設(shè)計(jì)思想與高效C編程

          ARM設(shè)計(jì)思想與高效C編程

          作者: 時(shí)間:2016-10-29 來(lái)源:網(wǎng)絡(luò) 收藏

          一.RISC

          本文引用地址:http://www.ex-cimer.com/article/201610/307383.htm

          ARM內(nèi)核采用RISC體系結(jié)構(gòu)。RISC是一種,其目標(biāo)是設(shè)計(jì)出一套能在高時(shí)鐘頻率下單周期執(zhí)行,簡(jiǎn)單而有效的指令集。RISC的設(shè)計(jì)重點(diǎn)在于由硬件執(zhí)行的指令的復(fù)雜度,這是因?yàn)檐浖扔布菀滋峁└蟮撵`活性和更高的智能。因此,RISC設(shè)計(jì)對(duì)編譯器有更高的要求;相反,傳統(tǒng)的復(fù)雜指令集的計(jì)算機(jī)(CISC)則更側(cè)重于硬件執(zhí)行指令的功能性,使CISC變得更復(fù)雜。

          RISC主要由下面4個(gè)設(shè)計(jì)準(zhǔn)則來(lái)實(shí)現(xiàn):

          ·指令集

          RISC處理器減少了指令種類,每條指令的長(zhǎng)度都是固定的,允許流水線在當(dāng)前指令譯碼階段去取其下一條指令;而CISC處理器中,指令的長(zhǎng)度通常不固定,執(zhí)行也需要多個(gè)周期。

          ·流水線

          在理想情況下,流水線每周期前進(jìn)一步,可獲得最高的吞吐率;而CISC指令的執(zhí)行需要調(diào)用微代碼的一個(gè)微程序。

          ·寄存器

          RISC處理器擁有更多的通用寄存器,每個(gè)寄存器都可存放數(shù)據(jù)或地址。寄存器可為所有的數(shù)據(jù)操作提供快速的局部存儲(chǔ)訪問(wèn);而CISC處理器都是用于特定目的的專用 處理器。

          ·load-store結(jié)構(gòu)

          處理器只能處理寄存器中的數(shù)據(jù)。獨(dú)立的load和store指令用來(lái)完成數(shù)據(jù)在寄存器和外部存儲(chǔ)器之間的傳送。因?yàn)樵L問(wèn)存儲(chǔ)器很耗時(shí),所以把存儲(chǔ)器訪問(wèn)和數(shù)據(jù)處理分開(kāi)。這樣有一個(gè)好處,那就是可反復(fù)地使用保存在寄存器中的數(shù)據(jù),而避免多次訪問(wèn)存儲(chǔ)器。相反,在CISC結(jié)構(gòu)中,處理器能夠直接處理存儲(chǔ)器中的數(shù)據(jù)。

          二.ARM設(shè)計(jì)思想

          為降低功耗,ARM處理器已被特殊設(shè)計(jì)成較小的核,較高的代碼密度。ARM內(nèi)核不是一個(gè)純粹的RISC體系結(jié)構(gòu),這是為了使它能夠更好的適應(yīng)其主要應(yīng)用領(lǐng)域-嵌入式系統(tǒng)。在某種意義上,甚至可以認(rèn)為ARM內(nèi)核的成功,正是因?yàn)樗鼪](méi)有在RISC概念上沉入太深?,F(xiàn)在系統(tǒng)的關(guān)鍵并不在于單純的處理器速度,而在于有效的系統(tǒng)性能和功耗。

          面向嵌入式系統(tǒng)的指令集

          ·一些特定指令的周期數(shù)可變

          例如:多寄存器裝載/存儲(chǔ)的load/store指令的執(zhí)行周期就是不確定的

          ·內(nèi)嵌桶形移位器產(chǎn)生了更為復(fù)雜的指令

          ·Thumb 16位指令集

          ·條件執(zhí)行

          ·增強(qiáng)指令

          三.高效的C

          1)C數(shù)據(jù)類型的有效用法

          ·對(duì)于存放在寄存器中的局部變量,除了8位或16位的算數(shù)模運(yùn)算符外,盡量不要使用char和short類型。而要使用有符號(hào)或者無(wú)符號(hào)的int類型。除法運(yùn)算時(shí)使用無(wú)符號(hào)數(shù)執(zhí)行速度更快。

          ·對(duì)于存放在主存儲(chǔ)器中的數(shù)組和全局變量,在滿足數(shù)據(jù)大小的前提下,應(yīng)盡可能使用小尺寸的數(shù)據(jù)類型,這樣做可以節(jié)省存儲(chǔ)空間。ARMv4體系結(jié)構(gòu)可以有效的裝載和存儲(chǔ)所有寬度的數(shù)據(jù),并可以使用遞增數(shù)組的指針來(lái)有效的訪問(wèn)數(shù)組。對(duì)于short類型數(shù)組,要避免使用數(shù)組基地址的偏移,因?yàn)長(zhǎng)DRH指令不支持偏移尋址。

          ·由于隱式或者顯式的數(shù)據(jù)類型轉(zhuǎn)換通常會(huì)有額外的指令周期開(kāi)銷,所以在表達(dá)式中應(yīng)盡量避免使用。load和store指令一般不會(huì)產(chǎn)生額外的轉(zhuǎn)換開(kāi)銷,因?yàn)閘oad和store指令是自動(dòng)完成數(shù)據(jù)類型轉(zhuǎn)換的。

          ·對(duì)于函數(shù)參數(shù)和返回值應(yīng)盡量避免使用char和short類型。即使參數(shù)范圍比較小,也應(yīng)該使用int類型,以防止編譯器做不必要的類型轉(zhuǎn)換。

          2)高效的編寫(xiě)循環(huán)體

          ·使用減計(jì)數(shù)到零的循環(huán)結(jié)構(gòu),這樣編譯器就不需要分配一個(gè)寄存器來(lái)保存循環(huán)中止值,而且與0比較的指令也可以省略。

          ·使用無(wú)符號(hào)的循環(huán)計(jì)數(shù)值,循環(huán)繼續(xù)的條件為i!=0而不是i>0,這樣可以保證循環(huán)開(kāi)銷只有兩條指令。、

          ·如果事先知道循環(huán)體至少會(huì)執(zhí)行一次,那么使用do-while循環(huán)要比f(wàn)or循環(huán)好,這樣可以使編譯器省去檢查循環(huán)計(jì)數(shù)值是否為0的步驟。

          ·展開(kāi)重要的循環(huán)體可降低循環(huán)開(kāi)銷,但不要過(guò)度展開(kāi),如果循壞的開(kāi)銷對(duì)整個(gè)程序來(lái)說(shuō)占的比例很小,那么循環(huán)展開(kāi)反而會(huì)增加代碼量并降低cache性能。

          ·盡量使數(shù)組的大小是4或8的倍數(shù),這樣就可以容易地以2,4,8次等多種選擇展開(kāi)循環(huán),而不需要擔(dān)心剩余數(shù)組元素的問(wèn)題。

          3)高效的寄存器分配

          ·應(yīng)該盡量限制函數(shù)內(nèi)部循環(huán)所用局部變量的數(shù)目,最多不超過(guò)12個(gè),這樣,編譯器就可以把這些變量都分配給ARM寄存器。

          ·可以引導(dǎo)編譯器,通過(guò)查看是否屬于最內(nèi)層循環(huán)變量來(lái)確定某個(gè)變量的重要性

          4)高效的調(diào)用函數(shù)

          ·盡量限制函數(shù)參數(shù)不要超過(guò)4個(gè),這樣函數(shù)調(diào)用的效率會(huì)更高。也可以將幾個(gè)相關(guān)的參數(shù)組織在一個(gè)結(jié)構(gòu)體中,用傳遞結(jié)構(gòu)體指針來(lái)代替多個(gè)參數(shù)。

          ·把比較小的被調(diào)用函數(shù)和調(diào)用函數(shù)放在同一個(gè)原文件中,并且要先定義,后調(diào)用,編譯器就可以優(yōu)化函數(shù)調(diào)用或者內(nèi)聯(lián)較小的函數(shù)。

          ·對(duì)性能影響較大的重要函數(shù)可使用關(guān)鍵字_inline進(jìn)行內(nèi)聯(lián)。

          5)避免指針別名

          ·不要依賴編譯器來(lái)消除包含存儲(chǔ)訪問(wèn)的公共子表達(dá)式,而應(yīng)建立一個(gè)新的局部變量來(lái)保存這個(gè)表達(dá)式的值,這樣可以保證只對(duì)這個(gè)表達(dá)式求職一次。

          ·避免使用局部變量的地址,否則對(duì)這個(gè)變量的訪問(wèn)效率會(huì)比較低。

          6)高效的結(jié)構(gòu)體安排

          ·結(jié)構(gòu)體元素要按照元素的大小來(lái)排列,以最小的元素放在開(kāi)始,最大的元素安排在最后。

          ·避免使用很大的結(jié)構(gòu)體,可以使用層次化的小結(jié)構(gòu)體來(lái)代替。

          ·為了提高可移植性,人工對(duì)API的結(jié)構(gòu)體添加填充位,這樣,結(jié)構(gòu)體的安排將不會(huì)依賴于編譯器。



          關(guān)鍵詞: 編程 設(shè)計(jì)思想

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();