Eclipse在線調試ARM11——Tiny6410+OpenJTAG
http://download.csdn.net/detail/girlkoo/4632348
本文引用地址:http://cafeforensic.com/article/201611/322800.htm1.工程的創(chuàng)建及編譯
Eclipse配置完成后我們來創(chuàng)建一個工程,首先是啟動Eclipse,Workspace可以根據自己的需要選擇,接下進行工程創(chuàng)建,F(xiàn)ile->New->C Project,在Project Name中填寫工程名稱,可以根據自己的項目需求填寫,這里我寫為leds,在下方的Project type選擇框中選擇Makefile project->Empty Project,在Toolchains選擇框中選擇Other toolchain,然后點擊Finish即可完成Tiny6410工程的創(chuàng)建,接下來我們編寫代碼,當然是leds燈的控制代碼,因為Leds燈代碼的例子多,容易懂,運行結果還可以在板子上直接看到,相當于學習編程時的Hello world。
新建文件start.S(File->New->File from template),編寫如下代碼:
- .externMain
- .global_start
- _start:
- ldrr0,=0x70000000
- orrr0,r0,#0x13
- mcrp15,0,r0,c15,c2,4
- ldrr0,=0x7E004000
- movr1,#0
- strr1,[r0]
- ldrsp,=8*1024
- blMain
- halt:
- bhalt
新建文件main.c(File->New->Source File),編寫如下代碼:
- voiddelay(inttimes){
- volatileinti;
- for(i=0;i!=times;++i){
- ;
- }
- }
- voidMain(){
- volatileunsignedlong*gpkcon0=(volatileunsignedlong*)0x7F008804;
- volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
- inti=0;
- *gpkcon0=(1<<16)|(1<<20)|(1<<24)|(1<<28);
- while(1){
- *gpkdat=~(i<<4);
- if(++i==16)
- i=0;
- delay(10000);
- }
- }
新建文件Makefile(File->New->File from template),編寫如下代碼:
- all:leds.bin
- leds.bin:start.omain.o
- arm-elf-ld-Ttext0-oleds.elfstart.omain.o
- arm-elf-objcopy-Obinaryleds.elfleds.bin
- arm-elf-objdump-Dleds.elf>leds.dis
- start.o:start.S
- arm-elf-gcc-g-ostart.ostart.S-c
- main.o:main.c
- arm-elf-gcc-g-omain.omain.c-c
- clean:
- rm*.oleds.elfleds.binleds.dis
然后就可以編譯該工程了,在Project Explorer中選中該工程(這里是leds)右鍵并在菜單中選擇Build Project即可編譯該工程,如果需要清除編譯產生的代碼選擇Clean Project即可,到這里已經完成了Tiny6410工程的編輯和編譯工作。
2.Eclipse通過OpenJTAG在線調試Tiny6410
使用Eclipse在線調試Tiny6410實際上是使用gdb在線調試Tiny6410,Eclipse的調試模塊是對GDB的封裝。GDB在線調試實際上是GDB的遠程調試,也就是說用GDB遠程鏈接GDB Server進行遠程調試,GDB遠程調試的詳細信息這里不多講,可以自己網上搜索一下。遠程調試時本機GDB從ELF文件中獲取調試信息,這就是配置調試信息時設置的C/C++ Application是編譯過程中生成的ELF文件而不會最終燒寫到ARM上運行的BIN文件的原因。
GDB可以在本機的ELF文件上獲取調試信息,但是單是這樣還不夠,還需要將對應的BIN文件燒寫到目標機的內存中,這樣進行通過GDB調試目標機時Eclipse將GDB下達調試指令轉換成OpenOCD的指令,由OpenOCD通過OpenJTAG來操作硬件,這樣,就是實現(xiàn)了GDB在本機下達調試指令,目標機相應的做出反應,也就是常說的單步調試。
由于GDB遠程調試Tiny6410時需要將BIN文件下載到內存,所以
(1)如果代碼在片內SRAM(Steppingstone)中運行
此時代碼的連接地址為0且代碼的體積小于Steppingstone的大小,對于Tiny6410來說代碼的體積需要小于8KB,這種情況下無需目標機初始化,可以直接調試程序。
(2)如果代碼在SDRAM、DDR或者其他存儲設備中運行
此時代碼的連接地址為0x50000000~0x5FFFFFFF之間,體積也有可能大于Steppingstone的容量,這時GDB調試前需要下載一個程序到Tiny6410來初始化其DDR,這樣OpenOCD才能通過OpenJTAG來將目標程序燒寫到DDR上。
因此,應該針對以上兩種情況做不同處理,對于第一種情況,GDB初始化文件可以這樣寫:
- targetremote127.0.0.1:3333
- monitorhalt
- #這兩條命令是關MMU
- monitorarmmcr1501000
- monitorstep0
- 對于第二種情況可以這樣寫:
- targetremote127.0.0.1:3333
- monitorhalt
- #這兩條命令是關MMU
- monitorarmmcr1501000
- monitorstep0
- echoConfiguringsystem...
- #下載init.bin到片內內存,目的是初始化DDR
- monitorload_imageD:/Working/arm/init/init.bin0x0c000000
- #運行
- monitorresume0x0c000000
- #停止
- monitorhalt
- #等待停止
- monitorwait_halt
評論