Linux下arm裸機(jī)開發(fā)環(huán)境搭建與實例
首先是arm工具鏈,arm工具鏈的編譯我就不寫了,一方面很麻煩,另一方面是這方面的資料網(wǎng)上已經(jīng)有很多了,我就不在這里多言浪費(fèi)大家時間了。我這里有自己編譯的arm工具鏈,當(dāng)然,用網(wǎng)上現(xiàn)成的也不是不可以,但是最好是自己熟悉過程,免得必要的時候不會從源碼配置。我將工具鏈上傳到空間,如果需要,盡管拿去,鏈接地址為,使用說明看資源備注:
本文引用地址:http://m.butianyuan.cn/article/201611/322827.htmhttp://download.csdn.net/detail/girlkoo/3689485
這樣,就可以開發(fā)普通的arm裸機(jī)程序了,現(xiàn)在開發(fā)環(huán)境是有了,編寫可以編譯通過的代碼很是容易,但是編寫真正運(yùn)行正常的卻不那么簡單,因此,燒錄工具還是必要的,我推薦是用minicom和dnw,minicom模擬與windows下的超級終端有相同的功能,這樣就可以像windows下開發(fā)環(huán)境一樣與vivi對話了,另外,我在網(wǎng)上下來多個dnw和dnw2,但是發(fā)現(xiàn)dnw2在某些情況下不是很穩(wěn)定,當(dāng)然也有聽說的成分,不管怎么說,就是個工具,不管哪個,用著順手就行,我用的是dnw,也可能是我點(diǎn)背,下載的幾個dnw燒錄大的鏡像可以,但是燒錄自己開發(fā)的程序,只有二三百K的小文件卻老是出錯,還好linux下是開放源碼的,于是我就修改了一番,當(dāng)然,限于水平因素,可能曲解了原作者的意圖,不過巧合的是燒錄小文件正常了,大的文件也可以,或許你用的時候并沒有這個問題,那么請您使用原版的dnw,指出小弟缺點(diǎn),如果不幸弄巧成拙求諸位不要噴我,下面是我修改后的dnw源碼及使用說明,下載地址是:
http://download.csdn.net/detail/girlkoo/3689525
配置好上面兩個工具后就可以開發(fā)arm2440的裸機(jī)程序了,當(dāng)然移植系統(tǒng)可能還會用到其他牛B的工具,等用到再去研究,如果有幸小弟弄明白了,還會來這里記錄下來的,下面附上兩個linux下的arm裸機(jī)程序及makefile,感覺對我這樣的新手來說還是有幫助的。
例子1:匯編文件led_on.S,代碼如下,這里我想告訴大家的是GNU的匯編跟標(biāo)準(zhǔn)的arm匯編是有出入的,具體的大家可以搜索“linux arm 匯編”來學(xué)習(xí)了解,網(wǎng)友給我們提供了足夠豐富的資源。
- .text
- .global_start
- _start:
- ldrr0,=0x56000010
- ldrr1,=0x00155555
- strr1,[r0]
- ldrr0,=0x56000014
- movr1,#0x0
- strr1,[r0]
- MAIN_LOOP:
- bMAIN_LOOP
編譯指令如下:
編譯:arm-linux-gcc -g -c -o led_on.o led_on.S
鏈接:arm-linux-ld -Ttext 0x30000000 -g -o led_on.elf led_on.o
轉(zhuǎn)換:arm-linux-objcopy -O binary -S led_on.elf led_on.bin
makefile可以這樣寫:
- led_on.bin:led_on.S
- arm-linux-gcc-g-c-oled_on.oled_on.S
- arm-linux-ld-Ttext0x30000000-gled_on.o-oled_on_elf
- arm-linux-objcopy-Obinary-Sled_on_elfled_on.bin
- clean:
- rm-fled_on.binled_on_elf*.o
例子2:如果使用廠家提供的Download and run,還可以編寫純C語言代碼來操作arm芯片,下面是流水等的代碼:
- #defineGPBCON(*(volatileunsigned*)0x56000010)
- #defineGPBDAT(*(volatileunsigned*)0x56000014)
- #defineGPBUP(*(volatileunsigned*)0x56000018)
- #defineMPLL100MHz0x0007f022
- #defineCLKDIV20x02
- #definerMPLLCON(*(volatileunsigned*)0x4c000004)
- #definerCLKDIVN(*(volatileunsigned*)0x4c000014)
- intmain()
- {
- inti=0;
- intcount=0;
- intLEDS[4]={0x1c0,0x1a0,0x160,0xe0};
- rMPLLCON=MPLL100MHz;
- rCLKDIVN=CLKDIV2;
- GPBCON=0x00155555;
- GPBUP=GPBUP&0xFF00;
- while(1)
- {
- for(count=0;count!=4;++count)
- {
- GPBDAT=LEDS[count];
- for(i=0;i<0x30000;i++);
- }
- }
- }
命令行下的編譯流程我就不寫了,直接把makefile貼在這里吧
- led.bin:led.c
- arm-linux-gcc-g-c-oled.oled.c
- arm-linux-ld-Ttext0x30000000-gled.o-oled.elf-emain
- arm-linux-objcopy-Obinary-Sled.elfled.bin
- .PYTHON:clean
- clean:
- rm*.oled.elfled.bin
評論