Board logo

标题: Ubuntu12.04下Xilinx MicroBlaze调试总结 [打印本页]

作者: yuyang911220    时间: 2015-11-25 19:50     标题: Ubuntu12.04下Xilinx MicroBlaze调试总结

硬件环境:HP CQ45 308
操作系统:KUbuntu12.04 LTS 32bit软件环境:ISE Design Suite 14.5 & VIVADO 2013.1
目标平台:Digilent Atlys(Spartan 6 LX45)        最近在调试Digilent Atlys Board,片上是Xilinx Spartan 6 FPGA XC6SLX45,在用xps综合出microblaze软核之后,主要的工作就是调试microblaze了。一开始遇到了不少问题,总结如下:
1. 使用xsdk创建bsp以及Application Project之后,链接的过程中出现如下类似错误:
    xxx.elf section `.stack' will not fit in region `microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl'
    region `microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl' overflowed by xxx bytes

由报错的内容的主要意思是microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl是数据以及指令存放的区域,.stack放不进该区域导致microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl溢出。
(如下链接中就有人遇到类似错误:http://forums.xilinx.com/t5/Embedded-Development-Tools/MicroBlaze-s-Stack-Overflown/td-p/291425
这里有两种解决方法:
a. 压缩原来的程序
由于我建立的工程是Memory Test的工程,因此本身并不会很大,我一开始尝试使用GCC的编译器优化,默认情况下是-O0,即不作任何优化,我将其修改为-Os,即Optimize for Size。

不过依旧报类似错误,仔细看一下xsdk生成的memory test的程序,也就是几个函数,没有道理会放不下,并且如果是要测试内存(这里我的理解应该是外部的DDR)的话,程序必须在BRAM中执行,不能放在外部DDR中,参考了一下Xilinx University Program课程的资料,按照上面的操作来还是会报这个错误,但是与此不同的仅仅是我使用的是14.5 ISE Design Suite,而XUP课程上用的是12.2的版本。于是我想会不会是有一些没有用到的函数也被一起放进了BRAM中,这里我想到了以前使用CooCox 的CoIDE的时候有一个GCC Link优化选项是Remove Unused Section,于是立即google一些关键字,找到了gcc ld优化选项 --gc-sections,打开shell,找到mb-ld的位置,输入mb-ld --help,然后看到了两行:
  --gc-sections               Remove unused sections (on some targets)
  --no-gc-sections            Don't remove unused sections (default)
看来默认情况下链接器是会把所有使用的段落全部放进可执行文件中的,于是在链接器中添加该命令,添加的地方如下图:

设置完了就可以顺利编译通过了,由此看来由于这次我包含的外设比较多,于是链接器将bsp中提供的外设api函数全部放进了bram中,如果外设比较少的话一般不会出现这种问题,这也是为什么XUP课程中编译就不会出现这种问题!
注意:如果是GCC 编译器作为linker来使用的话,直接加上--gc-sections是不能用的,还需要在前面加上-Wl选项,即-Wl,--gc-sections,即-Wl,<option>,这个命令的意思即将option作为参数传递给linker,比如avr-gcc就是这样子的,运行avr-gcc -help可以找到:
-Wl,<options>            Pass comma-separated <options> on to the linker
运行的时候需要在Program FPGA的同时设置可执行文件的路径,步骤如下:
首先,打开Program FPGA 工具:

然后,在Software Configuration中不能设置bootloop(这个在后面会用到),这里要制定之前生产的可执行文件,正如上面注明的,ELF File to Initialize in Block RAM,这是直接在Block RAM(BRAM)中初始化并执行的!





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0