
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)用程序開發(fā)隨著對(duì)高處理能力、實(shí)時(shí)多任務(wù)、超低功耗等方面需求的增長(zhǎng),高端處理器已經(jīng)進(jìn)入了國(guó)內(nè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集成開發(fā)環(huán)境,提供了對(duì)c和c+的支持,是目前開發(fā)arm的主要工具。本文針對(duì)日益縮短的嵌入式開發(fā)周期,結(jié)合arm系統(tǒng)開發(fā)調(diào)試閱歷,對(duì)用法arm標(biāo)準(zhǔn)庫(kù)舉行應(yīng)用程序開發(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)境下用來實(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ī)為通常沒有輸入和輸出功能的目標(biāo)硬件提供主機(jī)資源)。armulator、angel和multi-lce都支持這個(gè)環(huán)境,可以用法ads中提供的開發(fā)工具開發(fā)應(yīng)用程序,然后在armulator或者是開發(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ù)舉行程序開發(fā),不僅可以提高開發(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ù)開頭執(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è)過程稱為庫(kù)函數(shù)的裁減。普通狀況下,只需要重新定義很少的幾個(gè)函數(shù)就可以用法c庫(kù)。arm應(yīng)用系統(tǒng)開頭執(zhí)行用戶應(yīng)用程序,必需先將應(yīng)用程序加載到執(zhí)行域,建立應(yīng)用程序的執(zhí)行環(huán)境。用法c庫(kù)時(shí),這些繁瑣的工作就大部分由c函數(shù)來完成了。匯編程序完成系統(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ì)過程如下:將非啟動(dòng)
5、代碼的ro和rw執(zhí)行域代碼從加載域地址復(fù)制到執(zhí)行域地址;將zi域清零;跳轉(zhuǎn)到_rt_entry。調(diào)用_main()將大大簡(jiǎn)化匯編啟動(dòng)代碼的編寫,匯編代碼僅需完成系統(tǒng)硬件的初始化,而沒有須要將代碼從加載域地址復(fù)制到執(zhí)行域地址,以及zi域清零等工作。特殊是當(dāng)用法分布式加載時(shí)_main()的作用就越發(fā)顯然了。但是_main()并沒有建立c庫(kù)運(yùn)行必需的環(huán)境,這項(xiàng)工作由_rt_entry()完成,主要調(diào)用過程為:調(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í)候堆棧還沒有建立,堆棧由 rt_stackheap_init()來建立。上面容易介紹了c程序用法庫(kù)函數(shù)時(shí)的調(diào)用過程,由_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ù)沒有默認(rèn)的實(shí)現(xiàn)。實(shí)現(xiàn)該函數(shù),必需滿足下面的條件:用法不超過96字節(jié)的棧空間;除了r12(ip)外不要污染其他寄存器;將堆基址、?;?、堆邊界和棧邊界分離存在ror3作為返回參數(shù);堆必需保持8個(gè)字節(jié)對(duì)齊。實(shí)現(xiàn)例程如下:為了提高應(yīng)用程序開發(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ù)為例來作解釋。標(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理配藥計(jì)算講解
- 管理學(xué)原理組織結(jié)構(gòu)
- 居民議事協(xié)商能力提升培訓(xùn)
- 永煤消防考試題庫(kù)及答案
- 銀行研發(fā)面試題目及答案
- 中國(guó)好老師信息技術(shù)與學(xué)科教學(xué)深度融合培訓(xùn)心得體會(huì)模版
- 2025年蘇教版科學(xué)小學(xué)四年級(jí)下冊(cè)期末復(fù)習(xí)檢測(cè)題附答案(三)
- 陽(yáng)城公務(wù)員考試題及答案
- 敘永公務(wù)員考試題目及答案
- 行政公務(wù)員的考試題及答案
- 電氣工程及其自動(dòng)化畢業(yè)設(shè)計(jì) 基于PLC的噴涂機(jī)器人控制系統(tǒng)的設(shè)計(jì)
- 管理學(xué)基礎(chǔ)-形考任務(wù)三-國(guó)開-參考資料
- 團(tuán)員發(fā)展紀(jì)實(shí)簿
- 高頻變壓器作業(yè)指導(dǎo)書
- 事業(yè)單位招聘人員體檢表
- Visio圖標(biāo)-visio素材-網(wǎng)絡(luò)拓?fù)鋱D庫(kù)
- 軌道交通建設(shè)工程施工現(xiàn)場(chǎng)消防安全管理課件
- 綠色施工策劃書(模板)
- 騰訊微博VS新浪微博
- 公共政策導(dǎo)論完整版課件全套ppt教學(xué)教程(最新)
- 肺癌生活質(zhì)量量表
評(píng)論
0/150
提交評(píng)論