摘要:本文以C語(yǔ)言為例,通過(guò)一些具體的例子,探討了在進(jìn)行程序設(shè)計(jì)語(yǔ)言代碼編寫過(guò)程中不同的編寫語(yǔ)句產(chǎn)生不同的代碼運(yùn)行效率,從而提高C語(yǔ)言程序設(shè)計(jì)的質(zhì)量,提升C語(yǔ)言程序設(shè)計(jì)的能力培養(yǎng)。
關(guān)鍵詞: C 語(yǔ)言;程序設(shè)計(jì);運(yùn)行效率
中圖分類號(hào):TP312.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2012) 17-0000-02
嵌入式程序設(shè)計(jì)是結(jié)合 C 語(yǔ)言知識(shí)為基礎(chǔ),是利用基本的 C 語(yǔ)言知識(shí),面向嵌入式工程實(shí)際應(yīng)用進(jìn)行程序設(shè)計(jì)語(yǔ)言。在很多理工科專業(yè),特別是計(jì)算機(jī)專業(yè)學(xué)生必修的一門非常重要的專業(yè)課基礎(chǔ)課,學(xué)生可以通過(guò)嵌入式程序設(shè)計(jì),掌握程序設(shè)計(jì)的基本方法,形成正確的編程思、掌握正確的編程技巧、具備一定的程序調(diào)適能力。程序設(shè)計(jì)能力,特別是問(wèn)題的分析解決能力、語(yǔ)言的開發(fā)和環(huán)境的綜合應(yīng)用能力以及如何能夠在嵌入式系統(tǒng)開發(fā)中熟練、正確地運(yùn)用C語(yǔ)言開發(fā)出高質(zhì)量的應(yīng)用程序,是學(xué)習(xí)嵌入式程序設(shè)計(jì)的關(guān)鍵。下面介紹基于C語(yǔ)言的嵌入式程序設(shè)計(jì)中存在幾個(gè)方面問(wèn)題:
1 定義變量
先看下面一個(gè)例子:
char char1;
short short1;
char char2;
int int1;
這里定義的 4 個(gè)變量形式都一樣,但是它們的次序不同,產(chǎn)生了數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)中的不同的數(shù)據(jù)布局,如下圖所示。顯然,第2種方式節(jié)約了更多的存儲(chǔ)空間。
第一種數(shù)據(jù)布局:
第二種數(shù)據(jù)布局:
由此可見(jiàn),我們?cè)谧髯兞柯暶鞯臅r(shí)候,盡量把所有相同類型的變量放在一起定義,一種相同類型的變量定義一行,從而在數(shù)據(jù)的存儲(chǔ)上更加的合理。
對(duì)于局部變量類型的定義,通常情況下,習(xí)慣使用短整型 short 或 字符型char 來(lái)定義變量,達(dá)到節(jié)省存儲(chǔ)空間的目的[1];但是,當(dāng)一個(gè)函數(shù)的局部變量數(shù)目為數(shù)不多時(shí),反而達(dá)不到節(jié)省存儲(chǔ)空間的意圖。因?yàn)槌绦虻木幾g器會(huì)把局部變量分配給內(nèi)寄存器,使得每一個(gè)局部變量占用一個(gè)寄存器,假定 a 是任意可能的寄存器存儲(chǔ)函數(shù)的局部變量,分別去執(zhí)行加1的運(yùn)算,32 位的 int 型變量最快,只需要用到 1 條加法指令。而 16位和 8位變量,完成加法操作后,因?yàn)?6位和8位它們的位數(shù)不夠還需要在 32 位的寄存器中進(jìn)行擴(kuò)張展,進(jìn)行擴(kuò)展的過(guò)程中,還分兩種情況,第一種情況,其中有符號(hào)的變量,要用邏輯左移(LSL) 和算術(shù)右移(ASR)2 條指令才能完成符號(hào)擴(kuò)展;第二種情況,無(wú)符號(hào)的變量,要使用1條邏輯“與”(AND)指令對(duì)符號(hào)位進(jìn)行清 0。所以,使用32 位 int 局部變量最有效率。
在變量的聲明和定義中,為了使程序能夠更加精簡(jiǎn),在設(shè)計(jì)程序過(guò)程中總是竭力避免使用冗余變量。一般情況下我們是這樣去做的,但有時(shí)候也有一些特殊的情況。
例如:冗余變量的使用與否比較。
int a(void);
int b(void);
int count;
void t1(void)
{count+=a();
count+=b();}
void t2(void)
{int counts=count;
counts+=a();
counts+=b();
count=counts;}
在第一種情況 t1()里,每次訪問(wèn)全局變量count時(shí),都要先從相應(yīng)的存儲(chǔ)器調(diào)入到寄存器里,a()或 b()函數(shù)經(jīng)調(diào)用后再返回原來(lái)的存儲(chǔ)區(qū)里面。在這個(gè)例子里,一共要進(jìn)行 2 次這樣的調(diào)入/返回操作(第一次是:調(diào)入,第二次是:返回)。而在第 2 種情況 t2()里,局部變量counts被分配以寄存器,這樣一來(lái),整個(gè)函數(shù)就只需 1 次調(diào)入/返回訪問(wèn)全局變量存儲(chǔ)器。減少存儲(chǔ)器訪問(wèn)的次數(shù)對(duì)于系統(tǒng)性能的改善是非常有好處的。
2 傳遞參數(shù)
有些時(shí)候,為了提高程序設(shè)計(jì)的全面性,我們也會(huì)將匯編語(yǔ)言結(jié)合C語(yǔ)言程序互相調(diào)用,定義統(tǒng)一的函數(shù)過(guò)程調(diào)用標(biāo)準(zhǔn) ATPCS(ARM-ThumbProcedure Call Standard)。ATPCS 定義了寄存器組中的{R0~R3}作為參數(shù)傳遞和結(jié)果返回寄存器。在一些函數(shù)定義過(guò)程中,如果函數(shù)的參數(shù)數(shù)目大于4個(gè),那么就要使用堆棧進(jìn)行傳遞。在設(shè)計(jì)時(shí),內(nèi)部寄存器的訪問(wèn)速度是遠(yuǎn)遠(yuǎn)大于存儲(chǔ)器,所以我們?cè)诔绦蛟O(shè)計(jì)過(guò)程中要盡可能的使參數(shù)的傳遞在寄存器里面進(jìn)行,由于參數(shù)數(shù)目大于4個(gè),就會(huì)使用堆棧傳遞,所以我們應(yīng)盡量把函數(shù)的參數(shù)控制在4個(gè)以下[2]。比如我們看下面這個(gè)例子:
這個(gè)例子是從 C 語(yǔ)言中調(diào)用到匯編語(yǔ)言函數(shù):
例子中的函數(shù) t1(c,d)用匯編來(lái)實(shí)現(xiàn)。根據(jù)ATPCS 的定義,函數(shù)的參數(shù)應(yīng)當(dāng)從左到右由寄存器來(lái)進(jìn)行傳遞,所以在匯編中可直接由 R0 和 R1 進(jìn)行引用。這樣,在 C 語(yǔ)言和匯編語(yǔ)言之間就非常容易實(shí)現(xiàn)相互調(diào)用了。
3 循環(huán)條件
計(jì)數(shù)器的循環(huán)是c語(yǔ)言程序中十分常用的一種流程控制結(jié)構(gòu)。在C語(yǔ)言中,常用下面累加計(jì)數(shù)的循環(huán)形式:for(count=1; count<=number; count++),這種累加計(jì)數(shù)的方法符合一般的自然思維習(xí)慣, for(count=number;count!=0;count--)這種遞減計(jì)數(shù)方法很少使用,這兩種for循環(huán)語(yǔ)句的形式在邏輯上看并沒(méi)有什么效率差異,但是映射到具體的體系結(jié)構(gòu)中時(shí),就產(chǎn)生了不一樣的過(guò)程,具體見(jiàn)如下程序。
從圖中可以發(fā)現(xiàn),遞減法比累加法少用了1條指令,當(dāng)循環(huán)的次數(shù)很小時(shí),機(jī)子運(yùn)行的效果不明顯,一旦當(dāng)循環(huán)次數(shù)比較大時(shí),這兩段for循環(huán)的代碼就會(huì)在產(chǎn)生明顯的性能上的差異[3]。
我們來(lái)分析一下具體的原因出在哪里:當(dāng)編譯器進(jìn)行一個(gè)非0常數(shù)比較的時(shí)候,需要用到專門的 CMP 指令來(lái)執(zhí)行這樣的語(yǔ)句;而當(dāng)編譯器進(jìn)行一個(gè)變量與0比較時(shí),指令可以直接根據(jù)條件執(zhí)行的特征來(lái)進(jìn)行相應(yīng)的判斷。
因此,在嵌入式系統(tǒng)的體系結(jié)構(gòu)下編寫程序,對(duì)于循環(huán)條件的設(shè)置,采用遞減的算法比起累加的算法更合適。
參考文獻(xiàn):
[1]譚浩強(qiáng).C語(yǔ)言設(shè)計(jì)教程[M],北京清華大學(xué)出版社,2007,7.
[2]巍峰湖,陸紅.C語(yǔ)言程序設(shè)計(jì)課程教學(xué)方法探討[J].吉林大學(xué)學(xué)報(bào)(信息科學(xué)版),2005(8):35-38.
[3]謝娟英.大學(xué)計(jì)算機(jī)專業(yè)C與C++程序設(shè)計(jì)語(yǔ)言探討[J].計(jì)算機(jī)教育,2010(18):(84-89).
[4]田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京航空航天大學(xué)出版社,2010,2.
[作者簡(jiǎn)介]彭海琴(1983-)女,講師,程序員、網(wǎng)絡(luò)工程師,研究方向:程序設(shè)計(jì)、網(wǎng)絡(luò)技術(shù)。