• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    嵌入式C程序設(shè)計的優(yōu)化與應(yīng)用

    2014-04-29 00:00:00李世科
    數(shù)字化用戶 2014年9期

    【摘 要】用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.

    交口县| 辽宁省| 宁国市| 依兰县| 锡林浩特市| 辽宁省| 铁岭市| 新竹县| 阿鲁科尔沁旗| 城口县| 克拉玛依市| 琼海市| 浦城县| 马龙县| 苏尼特右旗| 邢台市| 莱西市| 建水县| 焉耆| 伊宁市| 霍山县| 伽师县| 丰镇市| 罗平县| 长兴县| 广安市| 博乐市| 东平县| 衡南县| 淮阳县| 兴化市| 全南县| 南昌市| 阳信县| 南丰县| 淮北市| 绥化市| 徐水县| 高雄县| 海淀区| 武威市|