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

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘 要:嵌入式系統(tǒng)對(duì)應(yīng)用軟件的質(zhì)量要求很高,在嵌入式開發(fā)中須注意對(duì)代碼進(jìn)行優(yōu)化,盡可能地提高代碼效率。雖然C編譯器都提供了一定程度的代碼優(yōu)化,但大部分由編譯器執(zhí)行

摘 要:嵌入式系統(tǒng)對(duì)應(yīng)用軟件的質(zhì)量要求很高,在嵌入式開發(fā)中須注意對(duì)代碼進(jìn)行優(yōu)化,盡可能地提高代碼效率。雖然C編譯器都提供了一定程度的代碼優(yōu)化,但大部分由編譯器執(zhí)行的優(yōu)化技術(shù)僅涉及執(zhí)行速度和代碼大小的平衡,不可能使程序既快又小,因而必須在編寫程序時(shí)采取必要的措施。本文針對(duì)高效率嵌入式程序開發(fā)提供了一些編程技巧,對(duì)實(shí)際系統(tǒng)開發(fā)具有重要作用。關(guān)鍵詞:編譯器; 程序開發(fā); 代碼優(yōu)化 [b]引言 [/b] 在多媒體、通信等計(jì)算復(fù)雜度高的應(yīng)用中,為了滿足制造費(fèi)用、功耗、性能以及實(shí)時(shí)性等諸多限制條件的要求,嵌入式系統(tǒng)程序往往需要特殊設(shè)計(jì)。這使得設(shè)計(jì)師在設(shè)計(jì)面向特定應(yīng)用的嵌入式軟件時(shí),需要有一套切實(shí)可行的編程準(zhǔn)則。而在實(shí)際程序設(shè)計(jì)中,工程師尤其需要考慮對(duì)變量的使用和循環(huán)程序的處理。 [b]變量使用 [/b] 在進(jìn)行實(shí)際程序開發(fā)時(shí),變量的使用至關(guān)重要,其中使用全局變量比向函數(shù)傳遞參數(shù)更加有效,這樣免去了函數(shù)調(diào)用時(shí)參數(shù)入棧和出棧的需要。當(dāng)然,使用全局變量會(huì)對(duì)程序有一些副作用。變量定義的次序會(huì)導(dǎo)致最終映像中數(shù)據(jù)布局的不同,如圖1所示。

圖1 變量映像次序混亂狀況 由此可見,在聲明變量時(shí),需要考慮怎樣最佳地控制存儲(chǔ)器布局。最好的方法是在編程的時(shí)候,把所有相同類型的變量放在一起定義。 通常,工程師設(shè)法使用short或char來定義變量以節(jié)省存儲(chǔ)器空間。在函數(shù)的局部變量數(shù)目有限的情況下,編譯器會(huì)把局部變量分配給內(nèi)部寄存器,每個(gè)變量占用一個(gè)寄存器。在這種情況下,使用short和char型變量不但不會(huì)節(jié)省空間,反而會(huì)帶來其它的副作用。如圖2所示:假定a是任意可能的寄存器,存儲(chǔ)函數(shù)的局部變量。同樣完成加1的操作,32位的int型變量最快,只用一條加法指令。而8位和16位變量,完成加法操作后,還需要在32位的寄存器中進(jìn)行符號(hào)擴(kuò)展。其中,帶符號(hào)的變量,要用邏輯左移和算術(shù)右移兩條指令才能完成符號(hào)擴(kuò)展;無符號(hào)的變量,要使用一條邏輯與指令對(duì)符號(hào)位進(jìn)行清零。所以,使用 32位的int或unsigned int局部變量最有效。某些情況下,函數(shù)從外部存儲(chǔ)器讀入局部變量進(jìn)行計(jì)算,這時(shí)候,需要把不是32位的變量轉(zhuǎn)換成32位。至于把8位或16位變量擴(kuò)展成 32位后,隱藏了原來可能溢出異常這個(gè)問題,需要進(jìn)一步仔細(xì)考慮。

圖2 不同類型局部變量的加法程序 在程序中,經(jīng)常會(huì)使用switch case語句,每一個(gè)由機(jī)器語言實(shí)現(xiàn)的測(cè)試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么,就浪費(fèi)了處理器時(shí)間。為了提高速度,可以把具體的情況按照它們發(fā)生的相對(duì)頻率排序。即把最可能發(fā)生的情況放在第一,發(fā)生概率小的情況放在最后,這樣會(huì)減少代碼平均執(zhí)行時(shí)間。 通常,工程師總是竭力避免使用冗余變量,以精簡(jiǎn)程序。一般情況下這樣做是正確的,但是也有例外,如下所示: int f(void); int g(void); file://f()和g()不訪問全局變量errs int errs; file://全局變量 void test1(void) { errs += f(); errs += g(); } void test2(void) { int localerrs = errs; // 定義冗余的局部變量 localerrs += f(); localerrs += g(); errs = localerrs; } 在第一種情況test1()里,每次訪問全局變量errs時(shí)都要先從相應(yīng)的存儲(chǔ)器下載到寄存器里,經(jīng)f()或g()函數(shù)調(diào)用后再存儲(chǔ)回原來的存儲(chǔ)器里面。在該例子中,一共要進(jìn)行兩次這樣的下載/存儲(chǔ)操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個(gè)函數(shù)就只需要一次下載/存儲(chǔ)全局變量存儲(chǔ)器了。盡量節(jié)省存儲(chǔ)器訪問的次數(shù),對(duì)于提高系統(tǒng)性能非常有用。 [b]循環(huán)程序的處理 [/b] 計(jì)數(shù)循環(huán)是程序中常用的流程控制結(jié)構(gòu)。在C中,類似下面的for循環(huán)比比皆是: for(loop=1;loop<=limit;loop++) 這種累加計(jì)數(shù)的方法符合一般的自然思維習(xí)慣,所以比下面的遞減計(jì)數(shù)方法使用更多: for(loop<=limit;loop!=0; loop--) 這兩者在邏輯上并沒有效率差異,但是映射到具體的體系結(jié)構(gòu)中,就產(chǎn)生了很大的不同。 累加法比遞減法多用了一條指令,當(dāng)循環(huán)次數(shù)比較多的時(shí)候,這兩段代碼就會(huì)在性能上產(chǎn)生明顯的差異。分析其本質(zhì)原因,在于當(dāng)進(jìn)行一個(gè)非零常數(shù)比較時(shí),必須用專門的CMP指令來執(zhí)行;而當(dāng)一個(gè)變量與零進(jìn)行比較時(shí),ARM指令可以直接利用條件執(zhí)行的特性(NE)來進(jìn)行判斷。很多時(shí)候循環(huán)展開由編譯器自動(dòng)完成,不過應(yīng)注意對(duì)中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開,這時(shí)候就需要工程師自己來做展開工作了。 尤其值得注意的是,在有內(nèi)部指令cache的CPU上(如ARM946ES芯片),因?yàn)檠h(huán)展開的代碼很大,往往會(huì)出現(xiàn)高速緩沖存儲(chǔ)器溢出。這時(shí)展開的代碼會(huì)頻繁地在CPU的高速緩沖存儲(chǔ)器和內(nèi)存之間來回調(diào)用,又因?yàn)楦咚倬彌_存儲(chǔ)器速度很高,所以此時(shí)循環(huán)展開反而會(huì)變慢。同時(shí),循環(huán)展開會(huì)影響矢量運(yùn)算優(yōu)化。 ARM處理器核對(duì)NZ(零比較轉(zhuǎn)移)有特別的指令處理,速度非???,如果你的循環(huán)對(duì)方向不敏感,可以由大向小循環(huán)。需要注意的是,如果指針操作使用了i 值,這種方法可能引起指針?biāo)饕绲膰?yán)重錯(cuò)誤(i = MAX+1)。當(dāng)然你可以通過對(duì)i做加減運(yùn)算來糾正,但是如果這樣就沒有提高效率的作用了。 [b]結(jié)語 [/b] 本文對(duì)高效率嵌入式ARM程序開發(fā)總結(jié)了一些編程技巧。在實(shí)際的嵌入式系統(tǒng)開發(fā)中,可以大大的提高系統(tǒng)的性能,特別是在多媒體和通信等復(fù)雜度高的應(yīng)用中,對(duì)程序設(shè)計(jì)具有指導(dǎo)意義。 參考文獻(xiàn): 1 Marshall P. Cline and Greg A. Lomow. C++ FAQs, Addison-Wesley, 1995 2 Bruce Eckel. Thinking in C++(C++ 編程思想,劉宗田 等譯),機(jī)械工業(yè)出版社,2000

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

深圳2025年9月11日 /美通社/ -- 近日,德國(guó)柏林國(guó)際電子消費(fèi)品展覽會(huì)(簡(jiǎn)稱IFA)期間,國(guó)際公認(rèn)的測(cè)試、檢驗(yàn)和認(rèn)證機(jī)構(gòu)SGS為極殼(Hypershell) 全球首款戶外動(dòng)力外骨骼產(chǎn)品Hypershell X 系...

關(guān)鍵字: SHELL RS AI SI

德國(guó)康佳特亮相上海工博會(huì),展示多款應(yīng)用就緒的嵌入式解決方案平臺(tái)

關(guān)鍵字: 嵌入式 傳感器 處理器

雙方攜手為客戶打造以存儲(chǔ)為核心的模塊化基礎(chǔ)架構(gòu),支持先進(jìn)的多裸片架構(gòu)設(shè)計(jì)

關(guān)鍵字: 非易失性存儲(chǔ) 半導(dǎo)體 嵌入式

本屆年會(huì)將在上海(11月13-14日)、北京(11月19-20日)和深圳(11月27-28日)舉行,面向嵌入式設(shè)計(jì)工程師推出25門技術(shù)課程

關(guān)鍵字: 嵌入式 MCU 模擬

柏林2025年9月6日 /美通社/ -- 柏林當(dāng)?shù)貢r(shí)間9月4日,在德國(guó)柏林國(guó)際電子消費(fèi)品展覽會(huì)(International Funkausstellung Berl...

關(guān)鍵字: 智能家電 RS 測(cè)試 掃地機(jī)器人

上海2025年9月5日 /美通社/ -- 由紐倫堡會(huì)展(上海)有限公司舉辦的上海國(guó)際嵌入式會(huì)議將于 2025 年 10 月 16-17 日在上海世博展覽館舉辦。 此次會(huì)議將由三個(gè)版塊組成:嵌入式技術(shù)會(huì)議、汽...

關(guān)鍵字: 嵌入式 CE CHINA EMBEDDED

從外部看,電子系統(tǒng)仿佛一個(gè)統(tǒng)一的學(xué)科或設(shè)備,各組成部分協(xié)同工作,渾然一體。然而揭開表象,其內(nèi)在卻是另一番景象:一個(gè)碎片化、多層次的世界——其中每一層都獨(dú)立且復(fù)雜,衍生出各自特有的工具、專家、工作流程,甚至哲學(xué)體系。

關(guān)鍵字: 嵌入式 電子系統(tǒng) 半導(dǎo)體

8位單片機(jī)在嵌入式設(shè)計(jì)領(lǐng)域已經(jīng)成為半個(gè)多世紀(jì)以來的主流選擇。盡管嵌入式系統(tǒng)市場(chǎng)日益復(fù)雜,8位單片機(jī)依然不斷發(fā)展,積極應(yīng)對(duì)新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機(jī)系列,配備了先進(jìn)的獨(dú)立...

關(guān)鍵字: 單片機(jī) 嵌入式 CPU

深圳2025年8月28日 /美通社/ -- 8月26日,2025 ELEXCON深圳國(guó)際電子展盛大啟幕。本屆大會(huì)以"All for AI"為主題,深圳市德...

關(guān)鍵字: AI 工業(yè)級(jí) SSD 嵌入式

深圳2025年8月26日 /美通社/ -- 8月26日,由博聞創(chuàng)意會(huì)展主辦的 第22屆深圳國(guó)際電子展暨嵌入式展(elexcon2025)在深圳(福田)會(huì)展中心隆重開幕。 作為中國(guó)電子與嵌入式技術(shù)領(lǐng)域的專業(yè)大展,本屆展會(huì)...

關(guān)鍵字: 嵌入式 電子 高通 AI
關(guān)閉