【摘 要】用C來編程不是任何問題都能較方便地妥善處理。如處理BCD碼、循環(huán)移位控制位信息連續(xù)變化、對時間要求很嚴(yán)格等問題的處理上,用匯編語言編程,就比用C語言編程更直接有效,但是又不愿意僅僅因為這么一小部分,就把整個程序都改用匯編來做,這時就必須學(xué)會把匯編語言編寫的源程序與C語言編寫的源程序結(jié)合起來。本文將主要探討嵌入式C程序設(shè)計的優(yōu)化與應(yīng)用。
【關(guān)鍵詞】嵌入式 C程序 設(shè)計 優(yōu)化
由于C語言是一種簡單的語言.它的功能大多來自于一些標(biāo)準(zhǔn)函數(shù)和宏,這些函數(shù)和宏在任何編譯器所附帶的庫中都是可用的。C庫中包含有一系列預(yù)先編譯好的函數(shù),以目標(biāo)文件的形式存在,可以連接到具體應(yīng)用中。在ANSI標(biāo)準(zhǔn)中對標(biāo)準(zhǔn)庫(Standard Library)的內(nèi)容進(jìn)行了定義[1]。其中包括用于輸入/輸出的函數(shù)、大量數(shù)學(xué)運(yùn)算函數(shù)(如所有三角函數(shù))以及其他數(shù)據(jù)處理函數(shù)。
一、編譯C程序
在完成C源代碼之后,將對其進(jìn)行編譯。最終產(chǎn)生的文件中包含有與源碼等價的機(jī)器碼,可以由目標(biāo)機(jī)直接執(zhí)行。它們已經(jīng)得到了廣泛的應(yīng)用,幾乎每個C源文件都不是孤立的。一旦有“額外”的文件加入,最終的可執(zhí)行程序?qū)⒂啥鄠€相關(guān)文件來構(gòu)建,方式通常非常復(fù)雜。同樣地,編譯C程序的過程將產(chǎn)生多個輸出文件。源程序編寫完成之后,使用C編譯器進(jìn)行編譯生成目標(biāo)文件。這種文件由可重定位代碼構(gòu)成,并不完全映射到處理器存儲器映射中。其他文件也得到進(jìn)一步處理(包括匯編語言源文件),以類似方式進(jìn)行編譯或匯編,最終生成以可重定位代碼為主要內(nèi)容的目標(biāo)文件。
在這個階段,除最簡單的程序之外,多數(shù)情況下需要與其他文件進(jìn)行組合,這些文件都已成為目標(biāo)文件。這些目標(biāo)文件可能來自于編譯器相關(guān)庫,或者由程序員或公司事先生成。連接器負(fù)責(zé)將不同的文件組合在一起并構(gòu)建一個單獨(dú)的可執(zhí)行文件。這個過程由連接器腳本(Linker Script)指導(dǎo)完成,連接器腳本用于定義處理器存儲器映射并提供其他信息,并有可能生成預(yù)編譯文件
二、在C程序中直接嵌入?yún)R編語句
在C程序中嵌入?yún)R編語句是一種直接的C模塊和匯編模塊接口方法。采用這種方法一方面可以在C程序中實(shí)現(xiàn)用C語言難以實(shí)現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器、中斷使能、讀取狀態(tài)寄存器和中斷標(biāo)志寄存器等。另一方面,也可以用這種方法在C程序中的關(guān)鍵部分用匯編語句代替C語句以優(yōu)化程序。
采用這種方法的一個缺點(diǎn)是它比較容易破壞C環(huán)境,因為C編譯器在編譯嵌入了匯編語句的C程序時并不檢查或分析所嵌入的匯編語句。嵌入?yún)R編語句的方法比較簡單,只需在匯編語句的左、右加上雙引號,用小括弧將匯編語句括住,在括弧前加上asm標(biāo)識符即可,如下所示:
asm(“匯編語句”)
在C程序中直接嵌入?yún)R編語句的一種典型應(yīng)用是控制DSP芯片的一些硬件資源。
三、嵌入式C程序設(shè)計的優(yōu)化及應(yīng)用
為了使單獨(dú)編譯的C語言程序和匯編程序之間能夠互相調(diào)用,必須讓子程序間的調(diào)用遵遁一定的規(guī)則。A丁PCS即ARM,Thumb過程調(diào)用標(biāo)準(zhǔn)(ARM/Thumb procedure call standard),是ARM程序和Thumb程序小子程序調(diào)用的基本規(guī)則,它規(guī)定了一些子程序間調(diào)用的基本規(guī)則,如子程序調(diào)用過程中寄存器的使用規(guī)則、堆棧的使用規(guī)則、參數(shù)的傳遞規(guī)則等。
(一)基本ATPCS
基本ATPCS規(guī)定了在子程序調(diào)用寸的一些基本規(guī)則,包括下面3方面的內(nèi)容:
1.各寄存器的使用規(guī)則及其相應(yīng)的名稱。
2.數(shù)據(jù)棧的使用規(guī)則。
3.參數(shù)傳遞的規(guī)則。
相對于其他類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少,但是它不能提供以下的支持:ARM程序和Thumb程序互相調(diào)用、數(shù)據(jù)以及代碼的位置無關(guān)的支持、子程序的可重入性和數(shù)據(jù)棧檢查的支持。
而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎(chǔ)上再添加其他的規(guī)則而形成的,其目的就是提供上述的功能。
(二)寄存器的使用規(guī)則
寄存器的使用必須滿足下面的規(guī)則。
1.子程序間通過寄存器R0-R3宋傳遞參數(shù)。這時,寄存器R0-R3可以記作A0-A3,被調(diào)用的子程序在返回前無需恢復(fù)寄存器R0-R3的內(nèi)容。
2.在子程序中,使用寄存器R4-R11來保存局部變量。這時,寄存器R4-R11可以記作V1-V8。如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值,對于子程序中沒有用到的寄存器則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4-R7來保存局部變量。
3.寄存器R12用于子程序間scratch寄存器,記作IP。在子程序間的連接代碼段中常有這種使用規(guī)則。
4.寄存器R13用于數(shù)據(jù)棧指針,記作SP。在子程序中寄存器R13不能做其他用途。寄存器SP在進(jìn)入子程序時的值和退出子程序時的值必須相等。
5.寄存器R14稱為連接寄存器,記作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以做其他用途。
6.寄存器R15是程序計數(shù)器,記作PC,它不能做其他用途。
(三)參數(shù)傳遞規(guī)則
根據(jù)參數(shù)個數(shù)是否固定可以將子程序分為參數(shù)個數(shù)固定的(nonvariadic)子程序和參數(shù)個數(shù)可變的(variadic)子程序,這兩種子程序的參數(shù)傳遞規(guī)則是不同的。
1.參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則
對于參數(shù)個數(shù)可變的子程序,當(dāng)參數(shù)不超過4個時,可以使用寄存器R0-R3來傳遞參數(shù),當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)。
在參數(shù)傳遞時,將所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳送到寄存器R0、R1、R2、R3中,如果參數(shù)多于4個,將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個字?jǐn)?shù)據(jù)先入棧。按照上面的規(guī)則,一個浮點(diǎn)數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)棧傳遞,也可能一半通過寄存器傳遞,另一半通過數(shù)據(jù)棧傳遞。
2.參數(shù)個數(shù)固定的子程序參數(shù)傳遞規(guī)則
對于參數(shù)個數(shù)固定的子程序,參數(shù)傳遞與參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則不同。對有調(diào)用關(guān)系的所有子程序必須遵守同一種ATPCS。編譯器或者匯編器在ELF格式的目標(biāo)文件中設(shè)置相應(yīng)的屬性,標(biāo)識用戶選定的ATPCS類型。對應(yīng)于不同類型的ATPCS規(guī)則,有相應(yīng)的C語言庫,連接器根據(jù)用戶指定的ATPCS類型連接相應(yīng)的C語言庫。使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS類型,而對于匯編語言程序來說,完全要依賴用戶來保證各子程序滿足選定的ATPCS類型。
四、結(jié)論
盡管C語言是一種比較強(qiáng)大的開發(fā)工具,必須對C語言編程有較透徹的掌握,其次,還應(yīng)該對實(shí)際電子硬件系統(tǒng)有深入的理解,當(dāng)然在學(xué)習(xí)嵌入之前,較為熟練地掌握用匯編語言編程是十分必要的。
參考文獻(xiàn):
[1]李文光. 基于MPC8548E的通用嵌入式計算機(jī)平臺系統(tǒng)軟件研究和實(shí)現(xiàn)[J]. 電子測試,2014,02:3-4+46.
[2]王艷芳. 單片機(jī)嵌入式程序的開發(fā)原理及應(yīng)用探討[J]. 電子技術(shù)與軟件工程,2013,23:271.
[3]陳侃松,劉洪波,熊攀. 基于ARM9的嵌入式Web服務(wù)器數(shù)據(jù)動態(tài)顯示的實(shí)現(xiàn)[J]. 物聯(lián)網(wǎng)技術(shù),2014,03:18-19+23.
[4]張鋒輝,王祥青,蘇守寶. 嵌入式C/S架構(gòu)服務(wù)器在電加熱爐遠(yuǎn)程溫度監(jiān)控中的應(yīng)用[J]. 井岡山大學(xué)學(xué)報(自然科學(xué)版),2013,02:56-59.
[5]曹敬瑜,柴瑋巖,王博,郭永紅. 嵌入式分布計算環(huán)境下的高效軟件構(gòu)件化框架研究[J]. 兵工學(xué)報,2013,04:451-458.