下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、使用arm標(biāo)準(zhǔn)c庫進(jìn)行嵌入式應(yīng)用程序開發(fā)隨著對高處理能力、實時多任務(wù)、超低功耗等方面需求的增長,高端處理器已經(jīng)進(jìn)入了國內(nèi)開發(fā)人員的視野,并在國內(nèi)得到了普遍的重視和應(yīng)用。是目前嵌入式領(lǐng)域應(yīng)用最廣泛的risc微處理器結(jié)構(gòu),憑借低成本、低功耗、高性能等優(yōu)點占領(lǐng)了嵌入式系統(tǒng)應(yīng)用領(lǐng)域的率先地位。ads是arm公司推出的arm集成開發(fā)環(huán)境,提供了對c和c+的支持,是目前開發(fā)arm的主要工具。本文針對日益縮短的嵌入式開發(fā)周期,結(jié)合arm系統(tǒng)開發(fā)調(diào)試閱歷,對用法arm標(biāo)準(zhǔn)庫舉行應(yīng)用程序開發(fā)作了比較系統(tǒng)的分析。1 arm標(biāo)準(zhǔn)庫介紹ads提供了ansi c和c+標(biāo)準(zhǔn)庫,本文僅研究ansi c庫,該庫包含下面幾個部
2、分:is0 c庫標(biāo)準(zhǔn)所定義的函數(shù);在semlhosted環(huán)境下用來實現(xiàn)c庫函數(shù)與目標(biāo)相關(guān)的函數(shù);c和c+編譯器要用法的heiper函數(shù)。該庫提供的諸如文件輸入輸出之類的設(shè)備,用法了標(biāo)準(zhǔn)的arm semihosted執(zhí)行環(huán)境(semihosting是針對arm目標(biāo)機的一種機制,它能夠按照應(yīng)用程序代碼的輸入/輸出哀求,與運行有調(diào)度功能的主機通信,這種技術(shù)允許主機為通常沒有輸入和輸出功能的目標(biāo)硬件提供主機資源)。armulator、angel和multi-lce都支持這個環(huán)境,可以用法ads中提供的開發(fā)工具開發(fā)應(yīng)用程序,然后在armulator或者是開發(fā)板上運行和調(diào)試該程序。假如要使應(yīng)用系統(tǒng)自立于這
3、個環(huán)境,則必需重新實現(xiàn)c庫中依靠于這個環(huán)境的相關(guān)函數(shù),按照用戶系統(tǒng)的運行環(huán)境對c庫舉行適當(dāng)?shù)牟脺p。用法ansi標(biāo)準(zhǔn)c庫舉行程序開發(fā),不僅可以提高開發(fā)效率而且可以增加程序的可移植性。在程序中用法庫函數(shù),必需先建立一個庫函數(shù)可以執(zhí)行的環(huán)境,這些工作都由庫中的函數(shù)完成。當(dāng)應(yīng)用程序鏈接了c庫中的函數(shù)時,c庫中的函數(shù)將完成:創(chuàng)建c程序所需的執(zhí)行環(huán)境(建立棧,假如需要創(chuàng)建一個堆,初始化程序用法的部分庫);調(diào)用main()函數(shù)開頭執(zhí)行c程序;支持程序用法的is0定義的函數(shù);捕捉運行時的錯誤和信號,假如需要,按照錯誤終止執(zhí)行或程序退出。2 裁減arm標(biāo)準(zhǔn)c函數(shù)庫標(biāo)準(zhǔn)庫中包含了部分依靠于arm semihost
4、ed執(zhí)行環(huán)境的函數(shù),這部分函數(shù)的函數(shù)名中包含有單個或兩個下劃線“-”,需要重新實現(xiàn)這部分函數(shù)。假如在程序中定義這些函數(shù),則編譯器就會用法新定義的函數(shù),這個過程稱為庫函數(shù)的裁減。普通狀況下,只需要重新定義很少的幾個函數(shù)就可以用法c庫。arm應(yīng)用系統(tǒng)開頭執(zhí)行用戶應(yīng)用程序,必需先將應(yīng)用程序加載到執(zhí)行域,建立應(yīng)用程序的執(zhí)行環(huán)境。用法c庫時,這些繁瑣的工作就大部分由c函數(shù)來完成了。匯編程序完成系統(tǒng)初始化后,跳轉(zhuǎn)到c程序的人口_main()(注重:不是main(),當(dāng)c程序中定義了main()主函數(shù)時,編譯器就會生成_main代碼)。由_main()引導(dǎo)庫函數(shù)完成c執(zhí)行環(huán)境的初始化,詳細(xì)過程如下:將非啟動
5、代碼的ro和rw執(zhí)行域代碼從加載域地址復(fù)制到執(zhí)行域地址;將zi域清零;跳轉(zhuǎn)到_rt_entry。調(diào)用_main()將大大簡化匯編啟動代碼的編寫,匯編代碼僅需完成系統(tǒng)硬件的初始化,而沒有須要將代碼從加載域地址復(fù)制到執(zhí)行域地址,以及zi域清零等工作。特殊是當(dāng)用法分布式加載時_main()的作用就越發(fā)顯然了。但是_main()并沒有建立c庫運行必需的環(huán)境,這項工作由_rt_entry()完成,主要調(diào)用過程為:調(diào)用_rt_stackheap_init()建立堆和棧;調(diào)用_rt_lib_init()初始化引用的庫函數(shù);假如需要,建立main()函數(shù)的參數(shù)argc和argv等;調(diào)用main()函數(shù),執(zhí)行應(yīng)
6、用程序,可以應(yīng)用庫函數(shù);用main()函數(shù)的返回值作參數(shù)調(diào)用exit()。_rt_entry并不是c函數(shù),它是用arm c庫編程的起始點。_rt_entry不能用宴現(xiàn),由于這時候堆棧還沒有建立,堆棧由 rt_stackheap_init()來建立。上面容易介紹了c程序用法庫函數(shù)時的調(diào)用過程,由_rtstackheap_init()建立c庫用法的內(nèi)存模型堆和棧。由于arm庫是建立在semihosted執(zhí)行環(huán)境的,它實現(xiàn)的內(nèi)存模型是基于這個環(huán)境的,所以必需修改這個內(nèi)存模型建立機制。表1列出了需要重新實現(xiàn)的函數(shù),實現(xiàn)了這些函數(shù),應(yīng)用程序就可以脫離宿主機環(huán)境自立運行了。其中,必需重新實現(xiàn)的是user
7、initialstackheap(),由于默認(rèn)的實現(xiàn)是基于semihosted執(zhí)行環(huán)境的,該函數(shù)被nstackheapinit()調(diào)用創(chuàng)建內(nèi)存模型,其他兩個函數(shù)沒有默認(rèn)的實現(xiàn)。實現(xiàn)該函數(shù),必需滿足下面的條件:用法不超過96字節(jié)的棧空間;除了r12(ip)外不要污染其他寄存器;將堆基址、?;贰⒍堰吔绾蜅_吔绶蛛x存在ror3作為返回參數(shù);堆必需保持8個字節(jié)對齊。實現(xiàn)例程如下:為了提高應(yīng)用程序開發(fā)效率和可移植性,希翼在目標(biāo)系統(tǒng)上用法arm庫提供的標(biāo)準(zhǔn)輸人輸出庫函數(shù)。高層輸入輸出函數(shù)是不依靠于目標(biāo)系統(tǒng)環(huán)境的,但是高層輸入輸出函數(shù)必需調(diào)用依靠于目標(biāo)系統(tǒng)的底層函數(shù),才干實現(xiàn)應(yīng)用系統(tǒng)的輸入輸出。依據(jù)目標(biāo)系
8、統(tǒng)硬件環(huán)境重新定義這些底層函數(shù),就可以用法庫提供的標(biāo)準(zhǔn)inputoutput庫函數(shù)了。下面以裁減arm標(biāo)準(zhǔn)庫提供的printf系列輸出函數(shù)為例來作解釋。標(biāo)準(zhǔn)i/o庫中最常用的是printf系列函數(shù),包括_printf()、printf()、_fprintf()、fprintf()、vprintf()和vfprintf()。全部這些函數(shù)非透亮地用法_file,并且僅依靠于fputc()和ferror()兩個函數(shù)。函數(shù)_printf()和_fprintf()與printf()和fprintf()的區(qū)分僅在于前兩個函數(shù)不能格式化浮點值。只要定義了自己的_file版本和fputc()、ferror()
9、函數(shù),外加定義一個具有file類型的_stdout變量,就可以不作任何修改地用法printf系列、fwrite()、fputs()和puts()函數(shù)了。下面給出了詳細(xì)實現(xiàn)的模板,可以按照實際需要修改。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)/*用戶實現(xiàn)的fpute代碼。輸出一個字符,可以按照需要實現(xiàn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙干股協(xié)議書
- 三農(nóng)政策下的鄉(xiāng)村旅游發(fā)展作業(yè)指導(dǎo)書
- 礦業(yè)與資源開發(fā)技術(shù)作業(yè)指導(dǎo)書
- 技術(shù)服務(wù)合同
- 管理咨詢專業(yè)服務(wù)協(xié)議書
- 貸款擔(dān)保書的
- 三農(nóng)村合作社應(yīng)急管理方案
- 小學(xué)三年級口算題兩三位數(shù)乘除一位數(shù)
- 2025年陽泉資格證模擬考試
- 小學(xué)六年級數(shù)學(xué)口算競賽試題
- 智能RPA財務(wù)機器人開發(fā)教程-基于來也UiBot 課件 第1章-機器人流程自動化概述
- 2024-2025學(xué)年河南省鄭州市高二上期期末考試數(shù)學(xué)試卷(含答案)
- 2024-2025學(xué)年天津市河?xùn)|區(qū)高一上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含答案)
- 信永中和筆試題庫及答案
- 甲流乙流培訓(xùn)課件
- 《視網(wǎng)膜靜脈阻塞》課件
- 兒科學(xué)川崎病說課
- 2025《省建設(shè)工程檔案移交合同書(責(zé)任書)》
- 2025年云南農(nóng)墾集團總部春季社會招聘(9人)管理單位筆試遴選500模擬題附帶答案詳解
- 《大學(xué)英語1》期末考試試卷及答案(???
- 《石油鉆井基本知識》課件
評論
0/150
提交評論