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