本来这篇心得应该在07年写的,由于懒惰,这个事情就一直delay了,最近突然又有了兴致,赶紧把一些东西记下来,以免忘记
在windows下调试NIOSII的软件应该说比较方便,NIOSII IDE还是很强大的,而且在windows下有FS2的调试软件,能够实现很底层的调试,那么linux下怎么办呢?当然安装linux版的IDE是可行的选择,但既然是学习,就应该从最底层学起了,下面要讨论的就是如何使用quartus自带的工具集来编写NIOSII的嵌入式软件。
第一步,写程序,为了简单起见,这里写了一个几条指令的汇编程序(下回再讲C语言的):
? .text
? .global _start
_start:
? /* load value */
? movui r2,0
loop:
? /* load high address */
? movhi r3,0x00a0
? /* load low address */
? ori r3,r3,0x1040
? /* wirte to led port */
? stwio r2,0(r3)
? /* invert r2 */
? nor r2,r2,r0
? /* jmp to start */
? br loop
保存成boot.S,注意了,是大写的S哦,大S能够使用一些伪指令和宏
第二步,写一个makefile
TARGET := boot
all:
?nios2-elf-as -gstabs+ -o ${TARGET}.o ${TARGET}.S
?nios2-elf-ld -o ${TARGET}.elf -T ${TARGET}.lds ${TARGET}.o
?nios2-elf-objdump -D ${TARGET}.elf
clean:
?\rm *.o
这里注意nios2-xxxx命令之前是TAB键,不是空格,要符合makefile的要求
这个makefile的意思就是先把boot.S编译成boot.o,然后把boot.o链接为boot.elf
最后用objdump命令反汇编,显示编译结果,as时用-gstabs+产生调试信息
第三步,写一个linker script文件,这个文件用来告诉链接器,怎么产生二进制代码
OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
OUTPUT_ARCH(nios)
ENTRY(_start) /* Defined in boot.S */
SECTIONS
{
? . = 0x0;
? .text : {*(.text)}
}
保存成boot.lds
关于linker script的详细介绍请参考
http://sources.redhat.com/binutils/docs-2.12/ld.info/index.html
第四步,编译
在命令行里面执行命令:
[duckfly@localhost boot]$ make
nios2-elf-as -gstabs+ -o boot.o boot.S
nios2-elf-ld -o boot.elf -T boot.lds boot.o
nios2-elf-objdump -D boot.elf
? ?
boot.elf: file format elf32-littlenios2
? ?
Disassembly of section .text:
? ?
00000000 <_start>:
? 0: 00800014 movui r2,0
? ?
00000004 <loop>:
? 4: 00c02834 movhi r3,160
? 8: 18c41014 ori r3,r3,4160
? c: 18800035 stwio r2,0(r3)
? 10: 1004303a nor r2,r2,zero
? 14: 003ffb06 br 4 <loop>
Disassembly of section .stab:
? ?
00000018 <.stab>:
? 18: 00000001 0x1
? 1c: 00080000 call 8000 <loop+0x7ffc>
? 20: 00000035 stwio zero,0(zero)
? 24: 00000008 cmpgei zero,zero,0
? 28: 00000064 muli zero,zero,1
? 2c: 00000000 call 0 <_start>
? 30: 00000001 0x1
? 34: 00000064 muli zero,zero,1
? ...
? 40: 00060044 movi zero,6145
? ...
? 4c: 00090044 movi zero,9217
? 50: 00000004 movi zero,0
? 54: 00000000 call 0 <_start>
? 58: 000b0044 movi zero,11265
? 5c: 00000008 cmpgei zero,zero,0
? 60: 00000000 call 0 <_start>
? 64: 000d0044 movi zero,13313
? 68: 0000000c andi zero,zero,0
? 6c: 00000000 call 0 <_start>
? 70: 000f0044 movi zero,15361
? 74: 00000010 cmplti zero,zero,0
? 78: 00000000 call 0 <_start>
? 7c: 00110044 movi zero,17409
? 80: 00000014 movui zero,0
Disassembly of section .stabstr:
?
00000084 <.stabstr>:
? 84: 6f6f6200 call 6f6f620 <loop+0x6f6f61c>
? 88: 00532e74 movhi at,19641
? 8c: 6d6f682f ldhio r21,-16992(r13)
? 90: 75642f65 stbio r21,-28483(r14)
? 94: 6c666b63 ldbuio r17,-26195(r13)
? 98: 72702f79 0x72702f79
? 9c: 63656a6f ldhio r13,-27223(r12)
? a0: 63752f74 orhi r13,r12,54461
? a4: 756e696c andhi r21,r14,47525
? a8: 72702f78 0x72702f78
? ac: 6172676f ldhio r5,-13923(r12)
? b0: 622f736d sthio r8,-16947(r12)
? b4: 2f746f6f ldhio ea,-11843(r5)
? ...
[duckfly@localhost boot]$
[duckfly@localhost boot]$ ls
boot.elf boot.lds boot.o boot.S Makefile
编译好的二进制文件就产生好了,可以看到反汇编产生的代码和源代码一样,只不过多了一些调试信息,
下面讲如何进行调试
调试前要确认BYTEBLASTERII/BYTEBLASTERV驱动已经装好,否则就没法连接开发板了。
可以用jtagconfig -n来确认一下:
[duckfly@localhost boot]$ jtagconfig -n
1) ByteBlasterMV [/dev/byteblaster0]
? 020820DD EP1C6
? Node 19104600
? Node 0C006E00
?
[duckfly@localhost boot]$
硬件都准备好了以后,通过quartus下载逻辑,也可以通过命令行下载:
通过命令nios2-configure-sof来下载sof文件
[duckfly@localhost hardware]$ nios2-configure-sof linux_80_19200.sof
Searching for SOF file:
in .
? linux_80_19200.sof
?
Info: *******************************************************************
Info: Running Quartus II Programmer
Info: Command: quartus_pgm --no_banner --mode=jtag -o p;./linux_80_19200.sof
Info: Using programming cable "ByteBlasterMV [/dev/byteblaster0]"
Info: Started Programmer operation at Sat Jun 27 23:53:43 2009
Info: Configuring device index 1
Info: Device 1 contains JTAG ID code 0x020820DD
Info: Configuration succeeded -- 1 device(s) configured
Info: Successfully performed operation(s)
Info: Ended Programmer operation at Sat Jun 27 23:53:47 2009
Info: Quartus II Programmer was successful. 0 errors, 0 warnings
? Info: Processing ended: Sat Jun 27 23:53:47 2009
? Info: Elapsed time: 00:01:27
[duckfly@localhost hardware]$
逻辑下载好了以后,启动软件调试环境,
第一步,启动nios2-gdb-server,这个程序用来接受gdb client的调试指令,并通过BYTEBLASTERII下载线传送给NIOSII的JTAG调试端口
[duckfly@localhost boot]$ nios2-gdb-server --stop --tcpport 1234 --tcppersist
Ignoring --stop option because --tcpport also specified
Using cable "ByteBlasterMV [/dev/byteblaster0]", device 1, instance 0x00
Pausing target processor: OK
Listening on port 1234 for connection from GDB:
这时,gdb-server就在监听TCP 1234端口,等待gdb 客户端程序的指令了
第二步,启动gdb客户端程序,nios2-elf-gdb是一个命令行的调试工具,nios2-elf-insight是一个图形界面调试器,这里我们使用insight,直观一点
[duckfly@localhost boot]$ nios2-elf-insight
启动以后,出现一个界面:
第三步,菜单 File -> Target Setting设置与目标板的连接方式
Hostname 写localhost,port写1234,还记得刚才nios2-gdb-server的启动参数吗?这里要一一对应
第四步,菜单 Run -> connect to target,会显示连接成功
第五步,打开要调试的程序,菜单 File -> open,选择boot.elf
第六步,下载目标程序,菜单 Run -> Download?
下载完成以后,工具栏上的按钮就有效了,这个时候就可以设置断点,单步跟踪了。。。
可以打开寄存器窗口,memory,局部变量,堆栈窗口等等,辅助调试,但是在这个例子里面好像用不上:)
这个时候,看看板子上的LED是不是跟着在闪烁了呢:)
好了,打完收工。。。
附所有工程文件:
https://static.assets-stash.eet-china.com/album/old-resources/2009/6/27/a73c29e2-13dd-40ef-883c-536f1c42cc77.zip
文章评论(0条评论)
登录后参与讨论