国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

高效率嵌入式程序開發

發布時間:2010-9-18 17:00    發布者:techshare
關鍵詞: 程序開發 , 嵌入式
在多媒體、通信等計算復雜度高的應用中,為了滿足制造費用、功耗、性能以及實時性等諸多限制條件的要求,嵌入式系統程序往往需要特殊設計。這使得設計師在設計面向特定應用的嵌入式軟件時,需要有一套切實可行的編程準則。而在實際程序設計中,工程師尤其需要考慮對變量的使用和循環程序的處理。

變量使用

在進行實際程序開發時,變量的使用至關重要,其中使用全局變量比向函數傳遞參數更加有效,這樣免去了函數調用時參數入棧和出棧的需要。當然,使用全局變量會對程序有一些副作用。變量定義的次序會導致最終映像中數據布局的不同,如圖1所示。



圖1 變量映像次序混亂狀況

由此可見,在聲明變量時,需要考慮怎樣最佳地控制存儲器布局。最好的方法是在編程的時候,把所有相同類型的變量放在一起定義。

通常,工程師設法使用short或char來定義變量以節省存儲器空間。在函數的局部變量數目有限的情況下,編譯器會把局部變量分配給內部寄存器,每個變量占用一個寄存器。在這種情況下,使用short和char型變量不但不會節省空間,反而會帶來其它的副作用。如圖2所示:假定a是任意可能的寄存器,存儲函數的局部變量。同樣完成加1的操作,32位的int型變量最快,只用一條加法指令。而8位和16位變量,完成加法操作后,還需要在32位的寄存器中進行符號擴展。其中,帶符號的變量,要用邏輯左移和算術右移兩條指令才能完成符號擴展;無符號的變量,要使用一條邏輯與指令對符號位進行清零。所以,使用32位的int或unsigned int局部變量最有效。某些情況下,函數從外部存儲器讀入局部變量進行計算,這時候,需要把不是32位的變量轉換成32位。至于把8位或16位變量擴展成32位后,隱藏了原來可能溢出異常這個問題,需要進一步仔細考慮。



圖2 不同類型局部變量的加法程序

在程序中,經常會使用switch case語句,每一個由機器語言實現的測試和跳轉僅僅是為了決定下一步要做什么,就浪費了處理器時間。為了提高速度,可以把具體的情況按照它們發生的相對頻率排序。即把最可能發生的情況放在第一,發生概率小的情況放在最后,這樣會減少代碼平均執行時間。

通常,工程師總是竭力避免使用冗余變量,以精簡程序。一般情況下這樣做是正確的,但是也有例外,如下所示:

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時都要先從相應的存儲器下載到寄存器里,經f()或g()函數調用后再存儲回原來的存儲器里面。在該例子中,一共要進行兩次這樣的下載/存儲操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個函數就只需要一次下載/存儲全局變量存儲器了。盡量節省存儲器訪問的次數,對于提高系統性能非常有用。

循環程序的處理

計數循環是程序中常用的流程控制結構。在C中,類似下面的for循環比比皆是:

for(loop=1;loop<=limit;loop++)

這種累加計數的方法符合一般的自然思維習慣,所以比下面的遞減計數方法使用更多:

for(loop<=limit;loop!=0; loop--)

這兩者在邏輯上并沒有效率差異,但是映射到具體的體系結構中,就產生了很大的不同。

累加法比遞減法多用了一條指令,當循環次數比較多的時候,這兩段代碼就會在性能上產生明顯的差異。分析其本質原因,在于當進行一個非零常數比較時,必須用專門的CMP指令來執行;而當一個變量與零進行比較時,ARM指令可以直接利用條件執行的特性(NE)來進行判斷。很多時候循環展開由編譯器自動完成,不過應注意對中間變量或結果被更改的循環,編譯程序往往拒絕展開,這時候就需要工程師自己來做展開工作了。

尤其值得注意的是,在有內部指令cache的CPU上(如ARM946ES芯片),因為循環展開的代碼很大,往往會出現高速緩沖存儲器溢出。這時展開的代碼會頻繁地在CPU的高速緩沖存儲器和內存之間來回調用,又因為高速緩沖存儲器速度很高,所以此時循環展開反而會變慢。同時,循環展開會影響矢量運算優化。

ARM處理器核對NZ(零比較轉移)有特別的指令處理,速度非常快,如果你的循環對方向不敏感,可以由大向小循環。需要注意的是,如果指針操作使用了i值,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1)。當然你可以通過對i做加減運算來糾正,但是如果這樣就沒有提高效率的作用了。

結語

本文對高效率嵌入式ARM程序開發總結了一些編程技巧。在實際的嵌入式系統開發中,可以大大的提高系統的性能,特別是在多媒體和通信等復雜度高的應用中,對程序設計具有指導意義。
本文地址:http://m.qingdxww.cn/thread-27792-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产毛片a | 精品伊人久久 | 亚欧洲精品在线视频免费观看 | 欧美午夜片 | 窝窝午夜在线观看免费观看 | 123日本不卡在线观看 | 亚洲国产一区在线二区三区 | 毛片在线播 | 国产日韩在线播放 | 看逼片| 一级做性色a爰片久久毛片免费 | 亚洲精品中文字幕午夜 | 内裤奇缘免费未删减版 | 另类视频在线观看 | 国产一区二区三区亚洲综合 | 欧美性色黄大片www 欧美性色xo影院永久禁欲 | 婷婷尹人香蕉久久天堂 | 欧美一区二区视频三区 | 男女网站在线观看 | 视频在线观看一区二区三区 | 欧美成一级 | 国产偷亚洲偷欧美偷精品 | 香蕉视频一区二区三区 | 日韩在线欧美在线 | 欧美日韩国产精品自在自线 | 99在线国产视频 | 两个人在线播放 | 五月婷婷六月激情 | 韩国毛片一级 | 97在线视频观看 | 色婷婷婷婷 | 四虎成人免费网站在线 | 国产精品东北一极毛片 | 国产 欧美 日韩 在线 | 五月亚洲综合 | www.操操操.com| 青草视频网站在线观看 | 国片一级 免费看 | 青青草原福利 | 国产成人v视频在线观看 | 国产精品一区二区三区四区五区 |