在Vitis里面创建了一个LwIP工程,调试的时候发现,在BRAM里面运行正常,但如果改到DDR3内存里面运行,启动时就会卡死在sleep函数上。
于是建立了一个Hello World工程来检查,代码如下:
#include
#include
#include "platform.h"
int main()
{
int i = 0;
init_platform();
xil_printf("Hello World\r\n");
xil_printf("Successfully ran Hello World application\r\n");
while (1)
{
xil_printf("i=%d\r\n", i);
i++;
sleep(1);
}
cleanup_platform();
return 0;
}
用xil_prinf串口打印函数,编译后.text的大小为4944。将xil_printf全部替换为printf(替换后所有的\r可以省去),编译后.text的大小为70964。
没有使能Instruction and Data Cache时,需要在MicroBlaze里面勾选Enable Peripheral AXI Instruction Interface,才能将程序放入DDR3内存中执行:
![pYYBAGGYSaKAVAs1AAD0gzlf86Y149.png](https://file.elecfans.com/web2/M00/1F/93/pYYBAGGYSaKAVAs1AAD0gzlf86Y149.png)
![poYBAGIMpxmALRTUAAAzYFhpVkU743.png](https://file.elecfans.com/web2/M00/30/CF/poYBAGIMpxmALRTUAAAzYFhpVkU743.png)
Code Sections就是程序代码的放置位置。
![pYYBAGIMpxqAZL0BAAELhozcV0c459.png](https://file.elecfans.com/web2/M00/30/D6/pYYBAGIMpxqAZL0BAAELhozcV0c459.png)
如果使能了Cache(勾选了Use Instruction and Data Caches),就可以不用勾选Enable Peripheral AXI Instruction Interface(勾不勾选,对sleep函数没有影响)。
![poYBAGIMpxyAD9_YAAE8j9hq3YM319.png](https://file.elecfans.com/web2/M00/30/CF/poYBAGIMpxyAD9_YAAE8j9hq3YM319.png)
测试后发现:
程序运行在DDR3中,开了cache,用printf:sleep无法使用
程序运行在DDR3中,开了cache,用xil_printf:sleep可以使用
程序运行在DDR3中,不开cache,用printf:sleep无法使用
程序运行在DDR3中,不开cache,用xil_printf:sleep无法使用
但是如果仔细看的话,会发现有些情况下sleep并不是完全卡死,而是过了好几分钟才返回,串口打印出下一个i的值。这说明sleep并不是无法使用,而是执行起来非常慢。
sleep函数内部是用汇编语句实现的,可能是放到DDR3里面执行的话,取指有一定的问题。放到BRAM里面则可以正常运行。
所以,如果程序很大,非要放到DDR3里面运行的话,那就最好不要使用sleep函数。可以自己修改sleep函数的代码,或者干脆自己重定义另外一个延时函数。
审核编辑:符乾江
-
Xilinx
+关注
关注
71文章
2172浏览量
122386 -
MicroBlaze
+关注
关注
3文章
68浏览量
21617
发布评论请先 登录
相关推荐
LDC1000里面配套的PCB线圈的电感值是多少?
使用AMD Vitis进行嵌入式设计开发用户指南
![使用AMD <b class='flag-5'>Vitis</b>进行嵌入式设计开发用户指南](https://file1.elecfans.com/web3/M00/05/37/wKgZO2d91oCATzE9AAANPruioLE081.png)
MicroBlaze V软核处理器的功能特性
![<b class='flag-5'>MicroBlaze</b> V<b class='flag-5'>软</b><b class='flag-5'>核</b>处理器的功能特性](https://file1.elecfans.com/web1/M00/F2/FD/wKgaoWcPFNuAfldVAAApC7zxlVU088.png)
评论