在Vitis里面創(chuàng)建了一個LwIP工程,調試的時候發(fā)現(xiàn),在BRAM里面運行正常,但如果改到DDR3內存里面運行,啟動時就會卡死在sleep函數(shù)上。
于是建立了一個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串口打印函數(shù),編譯后.text的大小為4944。將xil_printf全部替換為printf(替換后所有的\r可以省去),編譯后.text的大小為70964。
沒有使能Instruction and Data Cache時,需要在MicroBlaze里面勾選Enable Peripheral AXI Instruction Interface,才能將程序放入DDR3內存中執(zhí)行:


Code Sections就是程序代碼的放置位置。

如果使能了Cache(勾選了Use Instruction and Data Caches),就可以不用勾選Enable Peripheral AXI Instruction Interface(勾不勾選,對sleep函數(shù)沒有影響)。

測試后發(fā)現(xiàn):
程序運行在DDR3中,開了cache,用printf:sleep無法使用
程序運行在DDR3中,開了cache,用xil_printf:sleep可以使用
程序運行在DDR3中,不開cache,用printf:sleep無法使用
程序運行在DDR3中,不開cache,用xil_printf:sleep無法使用
但是如果仔細看的話,會發(fā)現(xiàn)有些情況下sleep并不是完全卡死,而是過了好幾分鐘才返回,串口打印出下一個i的值。這說明sleep并不是無法使用,而是執(zhí)行起來非常慢。
sleep函數(shù)內部是用匯編語句實現(xiàn)的,可能是放到DDR3里面執(zhí)行的話,取指有一定的問題。放到BRAM里面則可以正常運行。
所以,如果程序很大,非要放到DDR3里面運行的話,那就最好不要使用sleep函數(shù)。可以自己修改sleep函數(shù)的代碼,或者干脆自己重定義另外一個延時函數(shù)。
審核編輯:符乾江
-
Xilinx
+關注
關注
73文章
2185瀏覽量
125395 -
MicroBlaze
+關注
關注
3文章
68瀏覽量
21969
發(fā)布評論請先 登錄
使用AMD Vitis Unified IDE創(chuàng)建HLS組件

STM32G473進行雙bank升級的時候,進行FLASH的批量擦除回卡死是怎么回事?
如何使用AMD Vitis HLS創(chuàng)建HLS IP

STM32G473 flash擦除時程序卡死,為什么?
STM32G473 flash擦除時程序卡死的原因?
在Ubuntu16.04上從版本2020.1 OpenVINO?升級到2021.4.2之后不兼容怎么解決?
LDC1000里面配套的PCB線圈的電感值是多少?
使用AMD Vitis進行嵌入式設計開發(fā)用戶指南

AMD Vitis Unified Software Platform 2024.2發(fā)布
MicroBlaze V軟核處理器的功能特性

評論