0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx Vitis 2020.1里面MicroBlaze软核的sleep函数卡死的问题

C29F_xilinx_inc 来源:赛灵思 作者:赛灵思 2022-02-16 16:21 3333次阅读

在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

poYBAGIMpxmALRTUAAAzYFhpVkU743.png

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

pYYBAGIMpxqAZL0BAAELhozcV0c459.png

如果使能了Cache(勾选了Use Instruction and Data Caches),就可以不用勾选Enable Peripheral AXI Instruction Interface(勾不勾选,对sleep函数没有影响)。

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
    +关注

    关注

    72

    文章

    2174

    浏览量

    123280
  • MicroBlaze
    +关注

    关注

    3

    文章

    68

    浏览量

    21722
收藏 人收藏

    相关推荐

    LDC1000里面配套的PCB线圈的电感值是多少?

    LDC1000里面配套的PCB线圈的电感值是多少?还有用电感公式算出来的电感能用来做什么?我之前以为能算出靠近PCB线圈的电感的电感值
    发表于 01-17 08:07

    使用AMD Vitis进行嵌入式设计开发用户指南

    Zynq MPSoC 和 AMD Alveo 数据中心加速器卡)为目标的异构嵌入式应用。 Vitis 工具包括: C++ 编译器、库和本征函数,适用于 AI 引擎和可编程逻辑( PL ) 适用于 Arm
    的头像 发表于 01-08 09:33 1000次阅读
    使用AMD <b class='flag-5'>Vitis</b>进行嵌入式设计开发用户指南

    如何申请xilinx IP的license

    在使用FPGA的时候,有些IP是需要申请后才能使用的,本文介绍如何申请xilinx IP的license。
    的头像 发表于 10-25 16:48 817次阅读
    如何申请<b class='flag-5'>xilinx</b> IP<b class='flag-5'>核</b>的license

    MicroBlaze V处理器的功能特性

    本指南提供了有关 AMD Vivado Design Suite 中包含的 32 位和 64 位 MicroBlaze V 处理器的信息。该文档旨在用作为处理器硬件架构的指南,随附《RISC-V 指令集手册》第一卷和第二卷。
    的头像 发表于 10-16 09:17 762次阅读
    <b class='flag-5'>MicroBlaze</b> V<b class='flag-5'>软</b><b class='flag-5'>核</b>处理器的功能特性

    pcm5121里面EQ如何设定做1.1通道输出?

    pcm5121里面EQ如何设定做1.1通道输出
    发表于 09-30 08:27

    高斯卷积函数在图像采样中的意义

    高斯卷积函数在图像采样中的意义主要体现在以下几个方面: 1. 平滑处理与去噪 平滑图像 :高斯卷积函数通过其权重分布特性,即中心像素点权重最高,周围像素点权重逐渐降低,实现了对图像
    的头像 发表于 09-29 09:33 595次阅读

    [XILINX] 正点原子ZYNQ7035/7045/7100开发板发布、ZYNQ 7000系列、双ARM、PCIe2.0、SFPX2!

    正点原子FPGA新品ZYNQ7035/7045/7100开发板,ZYNQ 7000系列、双ARM、PCIe2.0、SFPX2! 正点原子Z100 ZYNQ开发板,搭载Xilinx Zynq7000
    发表于 09-02 17:18

    请问TINA-TI 9里面是否有与非门?

    TINA-TI 9里面是否有与非门?
    发表于 08-15 08:03

    STM32F407GET6的工程发CAN数据时,容易卡死在rt_device_write函数里面,为什么?

    同样是在RTThread里面调用 rt_device_write(can_dev, 0, &msg, sizeof(msg)) 发送CAN数据时, 基于STM32F407GET6的工程就容易卡死在这个函数
    发表于 07-15 08:26

    在ESP32使用esp-idf框架该如何获取系统上电时间呢?

    ESP8266里面可以通过 esp_get_time()函数 获取系统上电时间, 在 ESP32 使用 esp-idf 框架 该如何获取系统上电时间呢? 谢谢
    发表于 06-19 07:13

    esp32-c3使用esp_sleep_enable_ext1_wakeup()函数报错的原因?

    在程序中添加esp_sleep_enable_ext1_wakeup(ext_wakeup_pin_1_mask, ESP_EXT1_WAKEUP_ANY_HIGH);为啥会报错,在官网文档
    发表于 06-18 07:23

    FPGA的IP使用技巧

    FPGA的IP使用技巧主要包括以下几个方面: 理解IP的概念和特性 : IP是指用硬
    发表于 05-27 16:13

    关于FPGA IP

    对于深入学习使用FPGA的小伙伴们,特别是一些复杂的、大规模的设计应用,适宜的IP核对开发能起到事半功倍的作用。IP的概念与我们sdk库的概念相似。IP即电路功能模块,用户可以直接调用这些模块
    发表于 04-29 21:01

    AMD Vitis™ Embedded嵌入式软件开发套件的功能和特性概述

    Vitis Embedded 是一款独立的嵌入式软件开发套件,主要用于为 AMD 自适应 SoC 和 FPGA 中的 AMD 嵌入式处理子系统(基于 ARM 的子系统和 AMD MicroBlaze)开发并编译 C/C++ 软件。
    的头像 发表于 04-08 10:50 1149次阅读
    AMD <b class='flag-5'>Vitis</b>™ Embedded嵌入式软件开发套件的功能和特性概述

    stm32f405 ucoslll跳转后可以进入主程序,但为什么会卡死在OSTaskCreate函数

    stm32f405 ucoslll跳转后可以进入主程序,但是卡死在OSTaskCreate函数,任务无法运行。 void JumpToApp(void) { uint32_t i=0
    发表于 04-01 07:37