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

查看: 3814|回復(fù): 7
打印 上一主題 下一主題

高效率嵌入式ARM程序開發(fā)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2011-1-21 16:33:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)鍵詞: 程序開發(fā) , 多媒體 , 嵌入式 , 通信
在多媒體、通信等計算復(fù)雜度高的應(yīng)用中,為了滿足制造費用、功耗、性能以及實時性等諸多**條件的要求,嵌入式系統(tǒng)程序往往需要特殊設(shè)計。這使得設(shè)計師在設(shè)計面向特定應(yīng)用的嵌入式軟件時,需要有一套切實可行的編程準(zhǔn)則。而在實際程序設(shè)計中,工程師尤其需要考慮對變量的使用和循環(huán)程序的處理。
變量使用
 在進行實際程序開發(fā)時,變量的使用至關(guān)重要,其中使用全局變量比向函數(shù)傳遞參數(shù)更加有效,這樣免去了函數(shù)調(diào)用時參數(shù)入棧和出棧的需要。當(dāng)然,使用全局變量會對程序有一些副作用。變量定義的次序會導(dǎo)致最終映像中數(shù)據(jù)布局的不同,如圖1所示。

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

圖2 不同類型局部變量的加法程序
 在程序中,經(jīng)常會使用switch case語句,每一個由機器語言實現(xiàn)的測試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么,就浪費了處理器時間。為了提高速度,可以把具體的情況按照它們發(fā)生的相對頻率排序。即把最可能發(fā)生的情況放在第一,發(fā)生概率小的情況放在最后,這樣會減少代碼平均執(zhí)行時間。
 通常,工程師總是竭力避免使用冗余變量,以精簡程序。一般情況下這樣做是正確的,但是也有例外,如下所示:

int f(void);
int g(void);              
//f()和g()不訪問全局變量errs
int errs;            //全局變量
void test1(void)
{
   errs += f();
   errs += g();
}
void test2(void)
{
  int localerrs = errs;   
// 定義冗余的局部變量
  localerrs += f();
  localerrs += g();
  errs = localerrs;
}
 在第一種情況test1()里,每次訪問全局變量errs時都要先從相應(yīng)的存儲器下載到寄存器里,經(jīng)f()或g()函數(shù)調(diào)用后再存儲回原來的存儲器里面。在該例子中,一共要進行兩次這樣的下載/存儲操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個函數(shù)就只需要一次下載/存儲全局變量存儲器了。盡量節(jié)省存儲器訪問的次數(shù),對于提高系統(tǒng)性能非常有用。
循環(huán)程序的處理
 計數(shù)循環(huán)是程序中常用的流程控制結(jié)構(gòu)。在C中,類似下面的for循環(huán)比比皆是:
 for(loop=1;loop<=limit;loop++)
 這種累加計數(shù)的方法符合一般的自然思維習(xí)慣,所以比下面的遞減計數(shù)方法使用更多:
 for(loop<=limit;loop!=0; loop--)
 這兩者在邏輯上并沒有效率差異,但是映射到具體的體系結(jié)構(gòu)中,就產(chǎn)生了很大的不同。
    累加法比遞減法多用了一條指令,當(dāng)循環(huán)次數(shù)比較多的時候,這兩段代碼就會在性能上產(chǎn)生明顯的差異。分析其本質(zhì)原因,在于當(dāng)進行一個非零常數(shù)比較時,必須用專門的CMP指令來執(zhí)行;而當(dāng)一個變量與零進行比較時,ARM指令可以直接利用條件執(zhí)行的特性(NE)來進行判斷。很多時候循環(huán)展開由編譯器自動完成,不過應(yīng)注意對中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開,這時候就需要工程師自己來做展開工作了。
 尤其值得注意的是,在有內(nèi)部指令cache的CPU上(如ARM946ES芯片),因為循環(huán)展開的代碼很大,往往會出現(xiàn)高速緩沖存儲器溢出。這時展開的代碼會頻繁地在CPU的高速緩沖存儲器和內(nèi)存之間來回調(diào)用,又因為高速緩沖存儲器速度很高,所以此時循環(huán)展開反而會變慢。同時,循環(huán)展開會影響矢量運算優(yōu)化。
 ARM處理器核對NZ(零比較轉(zhuǎn)移)有特別的指令處理,速度非常快,如果你的循環(huán)對方向不敏感,可以由大向小循環(huán)。需要注意的是,如果指針操作使用了i值,這種方法可能引起指針?biāo)饕绲膰乐劐e誤(i = MAX+1)。當(dāng)然你可以通過對i做加減運算來糾正,但是如果這樣就沒有提高效率的作用了。
結(jié)語
 本文對高效率嵌入式ARM程序開發(fā)總結(jié)了一些編程技巧。在實際的嵌入式系統(tǒng)開發(fā)中,可以大大的提高系統(tǒng)的性能,特別是在多媒體和通信等復(fù)雜度高的應(yīng)用中,對程序設(shè)計具有指導(dǎo)意義。
沙發(fā)
發(fā)表于 2011-2-13 17:24:39 | 只看該作者
學(xué)習(xí)了
板凳
發(fā)表于 2011-2-17 23:52:12 | 只看該作者
了解一下
地板
發(fā)表于 2011-3-5 11:10:17 | 只看該作者
借來研究下
地下室
發(fā)表于 2011-4-6 20:13:07 | 只看該作者
學(xué)習(xí)了
6
發(fā)表于 2011-4-9 01:29:22 | 只看該作者
7
發(fā)表于 2011-5-14 14:03:32 | 只看該作者
很好很強大
8
發(fā)表于 2011-6-4 02:03:47 | 只看該作者
很好很強大
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: a集毛片| 久草香蕉视频 | 精品国产福利在线观看一区 | 欧美日韩另类综合 | 爱情综合症泰剧在线观看 | 色久天 | 亚洲swag精品自拍一区 | 免费v片视频在线观看视频 免费va在线观看 | 色在线免费 | h肉动漫在线观看免费资源 h肉动漫在线观看高清 | 中文字幕一区二区区免 | 亚洲免费综合色在线视频 | 久久久免费精品视频 | 国产精品久久一区一区 | 欧美激情视频一区二区三区 | 高清一区二区三区四区五区 | 午夜精品一区二区三区在线视 | 色欧美视频| 韩国大尺度女教师未删减在线 | 四虎国产精品免费视 | 日本黄色一区 | 久久久久久国产视频 | 国产欧美视频一区二区三区 | 亚洲国产欧美精品一区二区三区 | 国产精品视频网站 | 香港黄页亚洲一级 | 在线观看香蕉免费啪在线观看 | 91麻豆精品国产自产在线 | 花季传媒视频播放软件 | 韩国特级一级毛片免费网站 | 欧美第九页 | 国产精品久久久亚洲第一牛牛 | 香蕉视频啊啊啊 | 日韩精品中文字幕在线观看 | 成人午夜亚洲影视在线观看 | 久久久99精品免费观看精品 | 国产一区二区在线不卡 | 5566精品资源在线播放 | 亚洲视频日韩视频 | 欧美一区二区三区大片 | 在线精品视频在线观看高清 |