找到microblaze的gcc工具链目录并执行mb-gdb:
thinki@G31T-M2:/opt/Xilinx/14.5/ISE_DS/EDK/gnu/microblaze/lin/bin$ ./mb-gdb
./mb-gdb: error while loading shared libraries: libexpat.so.0: cannot open shared object file: No such file or directory
问题就是找不到libexpat.so.0,实际上Ubuntu12.04上用的是libexpat.so.1,只需要添加一个软链接即可!
cd /lib/i386-linux-gnu/
sudo ln -s libexpat.so.1 libexpat.so.0
ps:如果是64位的话,应该是位于/lib/x86_64-linux-gnu目录下。
解决方法到此处为止,下文是本人解决问题的思路以及一些想法。
在XUP课程中有一段关于该部分的内容:
As the .text section is targeted to external memory, the FPGA must be initialized with a bootloop
program, and the test application must be downloaded and executed from XMD shell
大体的意思是:
由于.text段被放在外部存储中,FPGA必须由bootloop初始化,并且应用程序必须通过XMD shell下载以及执行。
关于bootloop方面,Xilinx EDK CTT文档中有一段相关的描述:
You’ve now downloaded the bitstream to the FPGA and initialized the microprocessor
with a single-instruction "branch-to-itself" program called bootloop. Bootloop keeps the
processor in a known state while it waits for another program to be downloaded to run
or be debugged.
与bootloop相关的内容的意思是:
boot是一段不断循环的程序,它的功能是使得处理器运行在一个已知的状态并且等待其他的程序被下载运行或者被调试。
因此,FPGA Program的时候需要使用bootloop初始化,然后再将可执行文件通过XMD,即Xilinx Microprocessor Debugger。这里XMD涉及到的内容比较多,我看了不少资料,这里给出一个大体的理解。
从功能上讲,XMD是协助程序调试和系统验证的工具,Xilinx Embedded System Tools Reference Manual(UG111)中给出了下面这张图,有助于理解,可以看到XMD在底层硬件(JTAG调试器,Serial Interface)和上层软件(GDB,TCL等)之间建立了一座桥梁,从而用户可以使用GDB以及TCL等脚本语言进行硬件的调试,看到这里,如果熟悉的网友会想到另一个软件,即OpenOCD!两者的作用基本上是相同的!
实际上Xilinx的文档Embedded System Tools Reference Manual也给出了解释,验证了我的理解:
GDB is a powerful and flexible tool that provides a unified interface for debugging and verifying MicroBlaze and PowerPC (405 and 440) systems during various development phases. It uses Xilinx Microprocessor Debugger (XMD) as the underlying engine to communicate to processor targets.
因此在进行编程的时候首先需要连接上JTAG仿真器,然后打开XMD,最后再进行调试,然后由于XMD支持很多调试接口,所以选择很丰富,可以使用TCL脚本语言进行调试,也就是上面所说的,“the test application must be downloaded and executed from XMD shell”,这里的意思就是使用XMD shell脚本进行编程和下载,然后我觉得最重要的是XMD对于GDB的支持,使得程序调试变得异常高效,此时XMD就可以理解为是一个GDBServer!
ps:经过我的测试,这里GDB与在XMD shell下调试有一些不同,即使用GDB的时候不需要事先打开XMD。为此我做了一些测试:
1. 刚刚打开xsdk的时候,在linux终端中使用mb-gdb demo.elf,然后在gdb中用target remote :1234无法连接,观察系统监视器中的进程,无xmd相关进程。
2. 在xsdk中点击debug按钮,进入debug视图并成功开始debug之后,系统监视器中出现xmd进程,此时在终端中的gdb中输入target remote :1234,会提示“Remote debugging using :1234”,停止调试并再次在linux终端中使用mb-gdb demo.elf,然后在gdb中用target remote :1234连接成功!
3. 然后如果我把xmd进程kill掉,在linux终端中使用mb-gdb demo.elf,然后在gdb中用target remote :1234连接失败,在xsdk中点击debug按钮,debug失败,xsdk挂了(囧)。
最终得出的结论是,在xsdk中点击debug按钮,xsdk会自动地打开xmd并且提供1234端口号供gdb连接,并且xmd进程会一直开启,除非退出xsdk,另外Config JTAG Settings以及Program FPGA的过程中也会自动打开xmd进程。
这里衍生一下个人对于嵌入式系统在线调试的理解,在看上面这张图,可以看出有三个层次,我们在进行MCU或者MPU在线调试的时候,需要买JTAG仿真器,这里也就是对应于图的最底层。又需要使用很多开发环境,比如裸机下很著名的有Keil,IAR等等,这里也就是对于图的上两层,我认为本质上Keil以及IAR都会提供一个类似于XMD的功能(这里叫做On Chip Debugger),然后再做一个类似于GDB的Debugger,只不过在这些软件中,上面两层都被商业软件封装起来看不到了,但是在开源社区中,有一个非常流行的组合,即上面提到的OpenOCD+GDB,也就是对应于上图的中间层和最上层。
其实网上很多的资料都是在讲怎样在XPS下使用xmd,但是后来Xilinx官方网站上说了:
“Software development features are deprecated in Xilinx? Platform Studio (XPS). Xilinx recommends that you use the Software Development Kit (SDK) for all software development."所以大家不要被那些资料误导了:-)