Apr
15
如果你还没有注意到这些新工具,或许可以去看一下:
Xilinx Troubleshoot Center
Troubleshoot Content Portal列举了一些碰到疑难问题是需要检查的方面,比如Clocking Debug Guide等,还罗列了软件工具的Known issue list。
Configuration Problem Solver通过一系列问题检查Configuration过程中可能遇到的问题。
FPGA Design Best Practices
通过一系列视频教程告诉大家怎样才是一个好的设计,设计的时候需要考虑什么,改怎样利用时钟资源等等。
Xilinx Troubleshoot Center
Troubleshoot Content Portal列举了一些碰到疑难问题是需要检查的方面,比如Clocking Debug Guide等,还罗列了软件工具的Known issue list。
Configuration Problem Solver通过一系列问题检查Configuration过程中可能遇到的问题。
FPGA Design Best Practices
通过一系列视频教程告诉大家怎样才是一个好的设计,设计的时候需要考虑什么,改怎样利用时钟资源等等。
Apr
9
在Xilinx Forum上有一则关于Bootloader的讨论,人们说为什么用了Bootloader以后interrupt就不起作用了呢?
很久之前回了贴,回头一看竟变成了热贴。跟人讨论了之后才发现我原来把EDK自带的bootloader和Xapp1053中的Bootloader搞混淆了。
还记得我在《跟着Xapp1053继续做》一文中种种Customize吗?在那时我就提过Xapp1053中的Bootloader是不能处理中断的,于是忙乎了老半天把中断的相关内容复制到BRAM中。
忙乎了老半天,发现标准的Bootloader其实并没有这个缺陷。
关键在于标准bootloader使用SREC保存ELF信息。而Xapp1053的实现则使用了二进制bin的方式。
SREC中同时包含地址信息和数据;
BIN文件中只有数据没有地址。
因此用标准bootloader解析SREC后复制到目标地址,就跟直接用XMD下载ELF是一样的结果;
而用Xapp1053 Bootloader时,目标地址是手动指定的,并不是ELF中原生的地址,这样就有可能产生错误了。
【参考资料】
SREC: http://en.wikipedia.org/wiki/SREC_(file_format)
很久之前回了贴,回头一看竟变成了热贴。跟人讨论了之后才发现我原来把EDK自带的bootloader和Xapp1053中的Bootloader搞混淆了。
还记得我在《跟着Xapp1053继续做》一文中种种Customize吗?在那时我就提过Xapp1053中的Bootloader是不能处理中断的,于是忙乎了老半天把中断的相关内容复制到BRAM中。
忙乎了老半天,发现标准的Bootloader其实并没有这个缺陷。
关键在于标准bootloader使用SREC保存ELF信息。而Xapp1053的实现则使用了二进制bin的方式。
SREC中同时包含地址信息和数据;
BIN文件中只有数据没有地址。
因此用标准bootloader解析SREC后复制到目标地址,就跟直接用XMD下载ELF是一样的结果;
而用Xapp1053 Bootloader时,目标地址是手动指定的,并不是ELF中原生的地址,这样就有可能产生错误了。
【参考资料】
SREC: http://en.wikipedia.org/wiki/SREC_(file_format)
Apr
1
问题:通常我们设置breakpoint只能设置在某个函数或者某条指令上,那么我能不能在某个变量变化的时候让程序停下并让GDB指示现在停在哪里?
解决:通过XMD的Watch功能。
怎样使用watch功能?
- EDK --> MicroBlaze --> Configure IP --> Debug --> Number of Write/Read Address Watchpoints 设置为需要的数目,因为watch功能需要硬件支持
- 在使用GDB连接XMD并下载程序之后,在XMD输入相应的watch命令:
- 在GDB中Continue,程序就会在相应的地方停下,并在XMD窗口显示如下内容:
后续问题1: 这个watch和GDB图形程序中的Watch Expression有什么区别?
Watch Expression只能看到Expression的内容,不会在内容改变时将停下。
后续问题2: 怎样找到某个variable的地址?
方法1: 定义一个指针,把指针指向这个variable,就能得到地址了
方法2: 在GDB的Watch Experession中使用取地址符将这个variable的地址取出来。
方法3: 把这个变量定义为全局变量,那么地址在objdump的结果中就能直接找到。
【参考资料】
est_rm.pdf --> XMD章节
解决:通过XMD的Watch功能。
怎样使用watch功能?
- EDK --> MicroBlaze --> Configure IP --> Debug --> Number of Write/Read Address Watchpoints 设置为需要的数目,因为watch功能需要硬件支持
- 在使用GDB连接XMD并下载程序之后,在XMD输入相应的watch命令:
watch {r | w} <address> [<data>]
引用
Example Usage:
watch r 0x400 0x1234
watch r 0x40X 0x12X4
watch r 0b01000000XXXX 0b00010010XXXX0100
watch r 0x40X
说明:
Sets a read or write watchpoint at address. If the value compares to data, stop the processor.
• Address and Data can be specified in hex “0x” format or binary “0b” format.
• Don’t care values are specified using X.
• Addresses can be only of contiguous range.
• Default value of data is 0xXXXXXXXX. That is, it matches any value.
watch r 0x400 0x1234
watch r 0x40X 0x12X4
watch r 0b01000000XXXX 0b00010010XXXX0100
watch r 0x40X
说明:
Sets a read or write watchpoint at address. If the value compares to data, stop the processor.
• Address and Data can be specified in hex “0x” format or binary “0b” format.
• Don’t care values are specified using X.
• Addresses can be only of contiguous range.
• Default value of data is 0xXXXXXXXX. That is, it matches any value.
- 在GDB中Continue,程序就会在相应的地方停下,并在XMD窗口显示如下内容:
引用
XMD% watch w 0xbe4
XMD% Write Watchpoint 1 Hit, Processor Stopped at 0x000002e4
XMD% Write Watchpoint 1 Hit, Processor Stopped at 0x000002e4
后续问题1: 这个watch和GDB图形程序中的Watch Expression有什么区别?
Watch Expression只能看到Expression的内容,不会在内容改变时将停下。
后续问题2: 怎样找到某个variable的地址?
方法1: 定义一个指针,把指针指向这个variable,就能得到地址了
方法2: 在GDB的Watch Experession中使用取地址符将这个variable的地址取出来。
方法3: 把这个变量定义为全局变量,那么地址在objdump的结果中就能直接找到。
【参考资料】
est_rm.pdf --> XMD章节
Mar
19
研究了一下Xapp925和EPC Core。一些笔记和问题。
Mar
18
Walkie同学详细阐述了怎么在EDK系统中用标准的scanf()函数,提醒大家要注意heap大小的设置,并提供了简化的scanf()代码。推荐阅读。
现在就去看看 --> 在xilinx的FPGA系统中scanf函数的使用
现在就去看看 --> 在xilinx的FPGA系统中scanf函数的使用









