zoukankan      html  css  js  c++  java
  • [分享] Zynq-7000 XIP 2018.3,在QSPI Flash中运行程序

     
    有些应用中,单板没有DDR,OCM又不够存储所有数据和指令。这种情况下,Xilinx提供了参考设计Zynq-7000 AP SoC Boot - Booting and Running Without External Memory,把代码和只读数据放在QSPI Flash中运行程序,这就是execute in place (XIP)。

    上述XIP参考设计工作正常,但是最新只更新到了Vivado/SDK 2017.3,显得有点老旧,不匹配大部分应用中的工具版本。另外,上述XIP参考设计难于理解,也难于移植到其它单板。旧版本XIP参考设计的缺点。

    1. XIP参考设计工具版本旧。
    2. XIP参考设计改动的文件很多。
    3. XIP的相关代码没有单独标示出来。
    4. 有些改动还在BSP工程里,重新生成BSP工程,会被覆盖。

    为了便于使用,把XIP参考设计更新到Vivado/SDK 2018.3,并减少特殊文件,使用宏DDRLESS_XIP_SYSTEM包含所有XIP代码。改动后,所有与XIP相关的文件在FSBL或者Application的工程src目录下。所以SDK 2018.3版XIP参考设计具有以下优点。

    1. XIP参考设计工具版本新。
    2. XIP参考设计改动的文件更少。
    3. XIP的相关代码单独标示。
    4. 便于移植2018.3版XIP参考设计到其它单板。
    5. 便于移植2018.3版XIP参考设计到其它工具版本。

    1.1. Vivado 工程

    Zynq-7000 AP SoC Boot - Booting and Running Without External Memory提供了TCL脚本project.tcl、system_top.tcl,用于恢复硬件工程。
    把其中的版本号,从2017.3改为2018.3后,可以使用Vivado 2018.3执行project.tcl创建工程。
    但是恢复出来的硬件工程,仍然是使能了DDR控制器。建议在Vivado工程里禁止DDR控制器后,再编译硬件工程,导出HDF文件。

    1.2. FSBL

    FSBL 更改的文件如下:

    fsbl.h
    fsbl_handoff.S
    fsbl_hooks.c
    fsbl_hooks.h
    image_mover.c
    image_mover.h
    lscript.ld
    main.c
    pcap.c
    pcap.h
    qspi.c
    qspi.h
    translation_table.S
    xil_exception.c

    上述文件都放在FSBL工程的src目录下。
    引用的BSP工程,是普通FSBL工程的BSP工程。

    请在FSBL工程里设置里,定义宏FSBL_DEBUG_INFO,DDRLESS_XIP_SYSTEM 。

    1.3. C语言Application

    C语言Application更改的文件如下:

    Application.c
    lscript.ld
    startup.s
    TimerApp.c
    xil_exception.c

    上述文件都放在C语言Application工程的src目录下。
    引用的BSP工程,是普通Application工程的BSP工程。

    1.4. C++语言Application

    C++语言Application更改的文件如下:

    app.cc
    copyRO.cc
    cpu_init.S
    lscript.ld
    startup.s
    xil_exception.c

    上述文件都放在C++语言Application工程的src目录下。
    引用的BSP工程,是普通Application工程的BSP工程。

    1.5. 启动文件

    制作启动文件时,必须声明FSBL在Flash里执行,也就是xip_mode;也必须指定各个部分在Flash的地址,它对应软件的软的链接脚本一致。

    FSBL的链接脚本指定了FSBL占用Flash的位置从0x2000开始,所以启动文件的bootgen.bif也指定FSBL从Flash的0x2000开始。
    应用程序的链接脚本指定了FSBL占用Flash的位置从0x700000开始,所以启动文件的bootgen.bif也指定应用程序从Flash的0x700000开始。

    1.5.1. 启动文件的bootgen.bif

    //arch = zynq; split = false; format = BIN
    the_ROM_image:
    {
    	[bootloader, xip_mode, offset = 0x2000]C:prjfsbl_xip_v183.elf
    	[offset = 0x200000]C:prjdesign_noddr_wrapper.bit
    	[offset = 0x700000]C:prj\Application.elf
    }

    1.5.2. 常见错误

    在SDK里,重新指定文件名后,xip_mode会被删除。即使指定Application的ELF文件,FSBL的xip_mode属性也会被删除。如果在FSBL没有xip_mode属性的情况下直接制作启动文件,烧写后FSBL无法启动,即使定义了FSBL_DEBUG_INFO,也不会有任何打印。在重新指定文件名后,用文本编辑器打开对应的.bif文件,添加xip_mode属性,再创建启动文件,才能正常启动。

    1.6. 已知问题

    1.6.1. 调试

    XIP模式的代码,无法单步调试。
    调试器下载代码时,会按ELF中的地址下载。调试器假设代码使用的存储器是DDR。因为指令和只读数据在Flash里,所以无法下载。单步调试时,会修改指令,由于指令在Flash里,也无法修改。

    1.6.2. FSBL编译错误

    编译FSBL出现下列错误,可以忽略:

    ld.exe: FSBL_XIP.elf: section `.data' can't be allocated in segment 0

    1.6.3. C++语言Application编译错误

    编译C++语言Application出现下列错误,可以忽略:

    ld.exe: Application_Cpp.elf: section `.data' can't be allocated in segment 0

    1.6.4. 烧写Flash

    烧写Flash的时候必须指定一个FSBL文件。为了初始化单板,烧写Flash前必须运行这个FSBL,它要初始化QSPI等。因此必须修改FSBL的main.c,使其在没有DDR基地址情况下,只是不执行DDR相关操作,继续初始化devcfg、QSPI等模块。具体请参考SDK 2018.3烧写没有DDR的单板的Flash

  • 相关阅读:
    C#三种模拟自动登录和提交POST信息的实现方法
    关于c#调用C++代码的一些应用的体会
    c# 路径空格---ProcessStartInfo参数问题
    用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器
    使用C#开发纽曼USB来电小秘书客户端小结
    C#传递参数到线程的n个方法
    C# : 操作Word文件的API
    c# 导出Excel
    使用C#: 自动切换鼠标的左右手习惯
    Linux 系统的文件类型
  • 原文地址:https://www.cnblogs.com/hankfu/p/12017038.html
Copyright © 2011-2022 走看看