新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Eclipse在線調(diào)試ARM11——Tiny6410+OpenJTAG

Eclipse在線調(diào)試ARM11——Tiny6410+OpenJTAG

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
Eclipse、CDT、OpenJTAG驅(qū)動(dòng)、工具鏈以及OpenOCD的安裝這里就不多說(shuō)了,請(qǐng)根據(jù)OpenJTAG附帶光盤(pán)中的說(shuō)明進(jìn)行安裝,這里是OpenJTAG附帶光盤(pán)中的配置文檔,需要的話可以下載:

http://download.csdn.net/detail/girlkoo/4632348

本文引用地址:http://m.butianyuan.cn/article/201611/322800.htm

1.工程的創(chuàng)建及編譯

Eclipse配置完成后我們來(lái)創(chuàng)建一個(gè)工程,首先是啟動(dòng)Eclipse,Workspace可以根據(jù)自己的需要選擇,接下進(jìn)行工程創(chuàng)建,F(xiàn)ile->New->C Project,在Project Name中填寫(xiě)工程名稱,可以根據(jù)自己的項(xiàng)目需求填寫(xiě),這里我寫(xiě)為leds,在下方的Project type選擇框中選擇Makefile project->Empty Project,在Toolchains選擇框中選擇Other toolchain,然后點(diǎn)擊Finish即可完成Tiny6410工程的創(chuàng)建,接下來(lái)我們編寫(xiě)代碼,當(dāng)然是leds燈的控制代碼,因?yàn)長(zhǎng)eds燈代碼的例子多,容易懂,運(yùn)行結(jié)果還可以在板子上直接看到,相當(dāng)于學(xué)習(xí)編程時(shí)的Hello world。

新建文件start.S(File->New->File from template),編寫(xiě)如下代碼:

  1. .externMain
  2. .global_start
  3. _start:
  4. ldrr0,=0x70000000
  5. orrr0,r0,#0x13
  6. mcrp15,0,r0,c15,c2,4
  7. ldrr0,=0x7E004000
  8. movr1,#0
  9. strr1,[r0]
  10. ldrsp,=8*1024
  11. blMain
  12. halt:
  13. bhalt

新建文件main.c(File->New->Source File),編寫(xiě)如下代碼:

  1. voiddelay(inttimes){
  2. volatileinti;
  3. for(i=0;i!=times;++i){
  4. ;
  5. }
  6. }
  7. voidMain(){
  8. volatileunsignedlong*gpkcon0=(volatileunsignedlong*)0x7F008804;
  9. volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
  10. inti=0;
  11. *gpkcon0=(1<<16)|(1<<20)|(1<<24)|(1<<28);
  12. while(1){
  13. *gpkdat=~(i<<4);
  14. if(++i==16)
  15. i=0;
  16. delay(10000);
  17. }
  18. }

新建文件Makefile(File->New->File from template),編寫(xiě)如下代碼:

  1. all:leds.bin
  2. leds.bin:start.omain.o
  3. arm-elf-ld-Ttext0-oleds.elfstart.omain.o
  4. arm-elf-objcopy-Obinaryleds.elfleds.bin
  5. arm-elf-objdump-Dleds.elf>leds.dis
  6. start.o:start.S
  7. arm-elf-gcc-g-ostart.ostart.S-c
  8. main.o:main.c
  9. arm-elf-gcc-g-omain.omain.c-c
  10. clean:
  11. rm*.oleds.elfleds.binleds.dis

然后就可以編譯該工程了,在Project Explorer中選中該工程(這里是leds)右鍵并在菜單中選擇Build Project即可編譯該工程,如果需要清除編譯產(chǎn)生的代碼選擇Clean Project即可,到這里已經(jīng)完成了Tiny6410工程的編輯和編譯工作。

2.Eclipse通過(guò)OpenJTAG在線調(diào)試Tiny6410

使用Eclipse在線調(diào)試Tiny6410實(shí)際上是使用gdb在線調(diào)試Tiny6410,Eclipse的調(diào)試模塊是對(duì)GDB的封裝。GDB在線調(diào)試實(shí)際上是GDB的遠(yuǎn)程調(diào)試,也就是說(shuō)用GDB遠(yuǎn)程鏈接GDB Server進(jìn)行遠(yuǎn)程調(diào)試,GDB遠(yuǎn)程調(diào)試的詳細(xì)信息這里不多講,可以自己網(wǎng)上搜索一下。遠(yuǎn)程調(diào)試時(shí)本機(jī)GDB從ELF文件中獲取調(diào)試信息,這就是配置調(diào)試信息時(shí)設(shè)置的C/C++ Application是編譯過(guò)程中生成的ELF文件而不會(huì)最終燒寫(xiě)到ARM上運(yùn)行的BIN文件的原因。

GDB可以在本機(jī)的ELF文件上獲取調(diào)試信息,但是單是這樣還不夠,還需要將對(duì)應(yīng)的BIN文件燒寫(xiě)到目標(biāo)機(jī)的內(nèi)存中,這樣進(jìn)行通過(guò)GDB調(diào)試目標(biāo)機(jī)時(shí)Eclipse將GDB下達(dá)調(diào)試指令轉(zhuǎn)換成OpenOCD的指令,由OpenOCD通過(guò)OpenJTAG來(lái)操作硬件,這樣,就是實(shí)現(xiàn)了GDB在本機(jī)下達(dá)調(diào)試指令,目標(biāo)機(jī)相應(yīng)的做出反應(yīng),也就是常說(shuō)的單步調(diào)試。

由于GDB遠(yuǎn)程調(diào)試Tiny6410時(shí)需要將BIN文件下載到內(nèi)存,所以

(1)如果代碼在片內(nèi)SRAM(Steppingstone)中運(yùn)行

此時(shí)代碼的連接地址為0且代碼的體積小于Steppingstone的大小,對(duì)于Tiny6410來(lái)說(shuō)代碼的體積需要小于8KB,這種情況下無(wú)需目標(biāo)機(jī)初始化,可以直接調(diào)試程序。

(2)如果代碼在SDRAM、DDR或者其他存儲(chǔ)設(shè)備中運(yùn)行

此時(shí)代碼的連接地址為0x50000000~0x5FFFFFFF之間,體積也有可能大于Steppingstone的容量,這時(shí)GDB調(diào)試前需要下載一個(gè)程序到Tiny6410來(lái)初始化其DDR,這樣OpenOCD才能通過(guò)OpenJTAG來(lái)將目標(biāo)程序燒寫(xiě)到DDR上。

因此,應(yīng)該針對(duì)以上兩種情況做不同處理,對(duì)于第一種情況,GDB初始化文件可以這樣寫(xiě):

  1. targetremote127.0.0.1:3333
  2. monitorhalt
  3. #這兩條命令是關(guān)MMU
  4. monitorarmmcr1501000
  5. monitorstep0
  6. 對(duì)于第二種情況可以這樣寫(xiě):
  7. targetremote127.0.0.1:3333
  8. monitorhalt
  9. #這兩條命令是關(guān)MMU
  10. monitorarmmcr1501000
  11. monitorstep0
  12. echoConfiguringsystem...
  13. #下載init.bin到片內(nèi)內(nèi)存,目的是初始化DDR
  14. monitorload_imageD:/Working/arm/init/init.bin0x0c000000
  15. #運(yùn)行
  16. monitorresume0x0c000000
  17. #停止
  18. monitorhalt
  19. #等待停止
  20. monitorwait_halt

上一頁(yè) 1 2 下一頁(yè)

評(píng)論


推薦視頻

更多>>

技術(shù)專區(qū)

關(guān)閉