新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 做ARM裸機(jī)C與程序時(shí)的注意事項(xiàng)

做ARM裸機(jī)C與程序時(shí)的注意事項(xiàng)

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
在設(shè)置好芯片類(lèi)型,弄好芯片寄存器的宏定義后,接下來(lái)的編程就是走C的標(biāo)準(zhǔn)程序設(shè)計(jì)了。想法正確,但是ARM程序設(shè)計(jì)與以前大家學(xué)的8051是有差別的。
以前在KeilC51里面,在建立完工程之后,Keil會(huì)提示是否加入startup.a51的文件,這個(gè)文件用來(lái)初始化51芯片的各個(gè)硬件資源。如果不加,往往程序會(huì)運(yùn)行出錯(cuò)。
對(duì)于ARM裸機(jī),也一樣,只不過(guò)RVDS編譯器不會(huì)給你提供初始化的文件,都要自己寫(xiě)。一般工程文件為匯編和C的混合。因?yàn)楝F(xiàn)在的學(xué)習(xí)還不夠深入,所以目前也只清楚一些簡(jiǎn)單的程序設(shè)計(jì)框架。
例如,一般在工程文件中加一個(gè)init.s的匯編文件。里面僅有一句用于跳轉(zhuǎn)的匯編語(yǔ)句。假如你的C語(yǔ)言的入口函數(shù)為main,那么這句語(yǔ)句就是: BL main
init.s的寫(xiě)法,一般為如下;
AREA init , CODE ,READONLY //段名,很重要,因?yàn)樵谠O(shè)置起始段時(shí)有用
GLOBAL start //應(yīng)該設(shè)置為全局的,在設(shè)置入口點(diǎn)的時(shí)候有用,否則編譯器找不到
IMPORT main //由于main函數(shù)是外部函數(shù),所以要用import來(lái)聲明
ENTRY
start
BL main //跳轉(zhuǎn)到了C語(yǔ)言中的main函數(shù)了,也可以是其它函數(shù)
End
寫(xiě)好“引導(dǎo)”匯編程序及C語(yǔ)言程序后,還要進(jìn)行設(shè)置。在Edit菜單下的 Debug setting 或者 Release setting(關(guān)鍵看你設(shè)置的是調(diào)試還生成)的
link選項(xiàng)中選擇RealView Linker
設(shè)置好自己程序的程序的開(kāi)始的源地址后,再設(shè)置Layout菜單下的
Place at begining of image(放置鏡像的起始文件)
這里用的是目標(biāo)文件,用于鏈接時(shí)放在鏡像文件的最開(kāi)始,設(shè)置如下。意思是將init.o目標(biāo)文件的init段放在鏡像文件的最開(kāi)始。
這些設(shè)置完成之后,還必須設(shè)置入口點(diǎn),RealView Linker里面可以看到下面的命令行,加入
--entry=start 就可以了,現(xiàn)在編譯鏈接后,在Axd里面就可以通過(guò)Jtag調(diào)試了。

如果start在匯編中不是設(shè)置的global,那么鏈接的時(shí)候,鏈接器會(huì)警告無(wú)法找到入口。
也可以不用加匯編作“引導(dǎo)”,但是在設(shè)置的時(shí)候,你要清楚C轉(zhuǎn)為匯編后,你要用的段在哪里,入口函數(shù)在哪里。



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉