在Vitis里面創(chuàng)建了一個(gè)LwIP工程,調(diào)試的時(shí)候發(fā)現(xiàn),在BRAM里面運(yùn)行正常,但如果改到DDR3內(nèi)存里面運(yùn)行,啟動(dòng)時(shí)就會(huì)卡死在sleep函數(shù)上。
于是建立了一個(gè)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時(shí),需要在MicroBlaze里面勾選Enable Peripheral AXI Instruction Interface,才能將程序放入DDR3內(nèi)存中執(zhí)行:


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

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

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

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

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

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

評(píng)論