使用ARM標(biāo)準(zhǔn)C庫(kù)進(jìn)行嵌入式應(yīng)用程序開(kāi)發(fā)_第1頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、使用arm標(biāo)準(zhǔn)c庫(kù)進(jìn)行嵌入式應(yīng)用程序開(kāi)發(fā)隨著對(duì)高處理能力、實(shí)時(shí)多任務(wù)、超低功耗等方面需求的增長(zhǎng),高端處理器已經(jīng)進(jìn)入了國(guó)內(nèi)開(kāi)發(fā)人員的視野,并在國(guó)內(nèi)得到了普遍的重視和應(yīng)用。是目前嵌入式領(lǐng)域應(yīng)用最廣泛的risc微處理器結(jié)構(gòu),憑借低成本、低功耗、高性能等優(yōu)點(diǎn)占領(lǐng)了嵌入式系統(tǒng)應(yīng)用領(lǐng)域的率先地位。ads是arm公司推出的arm集成開(kāi)發(fā)環(huán)境,提供了對(duì)c和c+的支持,是目前開(kāi)發(fā)arm的主要工具。本文針對(duì)日益縮短的嵌入式開(kāi)發(fā)周期,結(jié)合arm系統(tǒng)開(kāi)發(fā)調(diào)試閱歷,對(duì)用法arm標(biāo)準(zhǔn)庫(kù)舉行應(yīng)用程序開(kāi)發(fā)作了比較系統(tǒng)的分析。1 arm標(biāo)準(zhǔn)庫(kù)介紹ads提供了ansi c和c+標(biāo)準(zhǔn)庫(kù),本文僅研究ansi c庫(kù),該庫(kù)包含下面幾個(gè)部

2、分:is0 c庫(kù)標(biāo)準(zhǔn)所定義的函數(shù);在semlhosted環(huán)境下用來(lái)實(shí)現(xiàn)c庫(kù)函數(shù)與目標(biāo)相關(guān)的函數(shù);c和c+編譯器要用法的heiper函數(shù)。該庫(kù)提供的諸如文件輸入輸出之類的設(shè)備,用法了標(biāo)準(zhǔn)的arm semihosted執(zhí)行環(huán)境(semihosting是針對(duì)arm目標(biāo)機(jī)的一種機(jī)制,它能夠按照應(yīng)用程序代碼的輸入/輸出哀求,與運(yùn)行有調(diào)度功能的主機(jī)通信,這種技術(shù)允許主機(jī)為通常沒(méi)有輸入和輸出功能的目標(biāo)硬件提供主機(jī)資源)。armulator、angel和multi-lce都支持這個(gè)環(huán)境,可以用法ads中提供的開(kāi)發(fā)工具開(kāi)發(fā)應(yīng)用程序,然后在armulator或者是開(kāi)發(fā)板上運(yùn)行和調(diào)試該程序。假如要使應(yīng)用系統(tǒng)自立于這

3、個(gè)環(huán)境,則必需重新實(shí)現(xiàn)c庫(kù)中依靠于這個(gè)環(huán)境的相關(guān)函數(shù),按照用戶系統(tǒng)的運(yùn)行環(huán)境對(duì)c庫(kù)舉行適當(dāng)?shù)牟脺p。用法ansi標(biāo)準(zhǔn)c庫(kù)舉行程序開(kāi)發(fā),不僅可以提高開(kāi)發(fā)效率而且可以增加程序的可移植性。在程序中用法庫(kù)函數(shù),必需先建立一個(gè)庫(kù)函數(shù)可以執(zhí)行的環(huán)境,這些工作都由庫(kù)中的函數(shù)完成。當(dāng)應(yīng)用程序鏈接了c庫(kù)中的函數(shù)時(shí),c庫(kù)中的函數(shù)將完成:創(chuàng)建c程序所需的執(zhí)行環(huán)境(建立棧,假如需要?jiǎng)?chuàng)建一個(gè)堆,初始化程序用法的部分庫(kù));調(diào)用main()函數(shù)開(kāi)頭執(zhí)行c程序;支持程序用法的is0定義的函數(shù);捕捉運(yùn)行時(shí)的錯(cuò)誤和信號(hào),假如需要,按照錯(cuò)誤終止執(zhí)行或程序退出。2 裁減arm標(biāo)準(zhǔn)c函數(shù)庫(kù)標(biāo)準(zhǔn)庫(kù)中包含了部分依靠于arm semihost

4、ed執(zhí)行環(huán)境的函數(shù),這部分函數(shù)的函數(shù)名中包含有單個(gè)或兩個(gè)下劃線“-”,需要重新實(shí)現(xiàn)這部分函數(shù)。假如在程序中定義這些函數(shù),則編譯器就會(huì)用法新定義的函數(shù),這個(gè)過(guò)程稱為庫(kù)函數(shù)的裁減。普通狀況下,只需要重新定義很少的幾個(gè)函數(shù)就可以用法c庫(kù)。arm應(yīng)用系統(tǒng)開(kāi)頭執(zhí)行用戶應(yīng)用程序,必需先將應(yīng)用程序加載到執(zhí)行域,建立應(yīng)用程序的執(zhí)行環(huán)境。用法c庫(kù)時(shí),這些繁瑣的工作就大部分由c函數(shù)來(lái)完成了。匯編程序完成系統(tǒng)初始化后,跳轉(zhuǎn)到c程序的人口_main()(注重:不是main(),當(dāng)c程序中定義了main()主函數(shù)時(shí),編譯器就會(huì)生成_main代碼)。由_main()引導(dǎo)庫(kù)函數(shù)完成c執(zhí)行環(huán)境的初始化,詳細(xì)過(guò)程如下:將非啟動(dòng)

5、代碼的ro和rw執(zhí)行域代碼從加載域地址復(fù)制到執(zhí)行域地址;將zi域清零;跳轉(zhuǎn)到_rt_entry。調(diào)用_main()將大大簡(jiǎn)化匯編啟動(dòng)代碼的編寫,匯編代碼僅需完成系統(tǒng)硬件的初始化,而沒(méi)有須要將代碼從加載域地址復(fù)制到執(zhí)行域地址,以及zi域清零等工作。特殊是當(dāng)用法分布式加載時(shí)_main()的作用就越發(fā)顯然了。但是_main()并沒(méi)有建立c庫(kù)運(yùn)行必需的環(huán)境,這項(xiàng)工作由_rt_entry()完成,主要調(diào)用過(guò)程為:調(diào)用_rt_stackheap_init()建立堆和棧;調(diào)用_rt_lib_init()初始化引用的庫(kù)函數(shù);假如需要,建立main()函數(shù)的參數(shù)argc和argv等;調(diào)用main()函數(shù),執(zhí)行應(yīng)

6、用程序,可以應(yīng)用庫(kù)函數(shù);用main()函數(shù)的返回值作參數(shù)調(diào)用exit()。_rt_entry并不是c函數(shù),它是用arm c庫(kù)編程的起始點(diǎn)。_rt_entry不能用宴現(xiàn),由于這時(shí)候堆棧還沒(méi)有建立,堆棧由 rt_stackheap_init()來(lái)建立。上面容易介紹了c程序用法庫(kù)函數(shù)時(shí)的調(diào)用過(guò)程,由_rtstackheap_init()建立c庫(kù)用法的內(nèi)存模型堆和棧。由于arm庫(kù)是建立在semihosted執(zhí)行環(huán)境的,它實(shí)現(xiàn)的內(nèi)存模型是基于這個(gè)環(huán)境的,所以必需修改這個(gè)內(nèi)存模型建立機(jī)制。表1列出了需要重新實(shí)現(xiàn)的函數(shù),實(shí)現(xiàn)了這些函數(shù),應(yīng)用程序就可以脫離宿主機(jī)環(huán)境自立運(yùn)行了。其中,必需重新實(shí)現(xiàn)的是user

7、initialstackheap(),由于默認(rèn)的實(shí)現(xiàn)是基于semihosted執(zhí)行環(huán)境的,該函數(shù)被nstackheapinit()調(diào)用創(chuàng)建內(nèi)存模型,其他兩個(gè)函數(shù)沒(méi)有默認(rèn)的實(shí)現(xiàn)。實(shí)現(xiàn)該函數(shù),必需滿足下面的條件:用法不超過(guò)96字節(jié)的??臻g;除了r12(ip)外不要污染其他寄存器;將堆基址、?;贰⒍堰吔绾蜅_吔绶蛛x存在ror3作為返回參數(shù);堆必需保持8個(gè)字節(jié)對(duì)齊。實(shí)現(xiàn)例程如下:為了提高應(yīng)用程序開(kāi)發(fā)效率和可移植性,希翼在目標(biāo)系統(tǒng)上用法arm庫(kù)提供的標(biāo)準(zhǔn)輸人輸出庫(kù)函數(shù)。高層輸入輸出函數(shù)是不依靠于目標(biāo)系統(tǒng)環(huán)境的,但是高層輸入輸出函數(shù)必需調(diào)用依靠于目標(biāo)系統(tǒng)的底層函數(shù),才干實(shí)現(xiàn)應(yīng)用系統(tǒng)的輸入輸出。依據(jù)目標(biāo)系

8、統(tǒng)硬件環(huán)境重新定義這些底層函數(shù),就可以用法庫(kù)提供的標(biāo)準(zhǔn)inputoutput庫(kù)函數(shù)了。下面以裁減arm標(biāo)準(zhǔn)庫(kù)提供的printf系列輸出函數(shù)為例來(lái)作解釋。標(biāo)準(zhǔn)i/o庫(kù)中最常用的是printf系列函數(shù),包括_printf()、printf()、_fprintf()、fprintf()、vprintf()和vfprintf()。全部這些函數(shù)非透亮地用法_file,并且僅依靠于fputc()和ferror()兩個(gè)函數(shù)。函數(shù)_printf()和_fprintf()與printf()和fprintf()的區(qū)分僅在于前兩個(gè)函數(shù)不能格式化浮點(diǎn)值。只要定義了自己的_file版本和fputc()、ferror()

9、函數(shù),外加定義一個(gè)具有file類型的_stdout變量,就可以不作任何修改地用法printf系列、fwrite()、fputs()和puts()函數(shù)了。下面給出了詳細(xì)實(shí)現(xiàn)的模板,可以按照實(shí)際需要修改。includestruct_fileint handle;/*用戶需要的任何代碼(假如用法文件僅是為了調(diào)試用法prinft在標(biāo)準(zhǔn)輸出端輸出信息,則不需要任何文件處理代碼)*/;flle_stdout;/*file在stdio.h中定義為:typedef struct_file file;*/int fputc(int ch,file*f)/*用戶實(shí)現(xiàn)的fpute代碼。輸出一個(gè)字符,可以按照需要實(shí)現(xiàn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論