在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內存中執行:
Code Sections就是程序代碼的放置位置。
如果使能了Cache(勾選了Use Instruction and Data Caches),就可以不用勾選Enable Peripheral AXI Instruction Interface(勾不勾選,對sleep函數沒有影響)。
測試后發現:
程序運行在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文章
2164瀏覽量
121015 -
MicroBlaze
+關注
關注
3文章
68瀏覽量
21533
發布評論請先 登錄
相關推薦
評論