【问题标题】:bare metal assembly program on Zynq without Vivado/SDKZynq 上的裸机组装程序,没有 Vivado/SDK
【发布时间】:2017-01-19 20:55:59
【问题描述】:

我有一个问题想问那些熟悉 Xilinx Zynq 和相关设计工具的人......

  1. 是否可以为 Zynq 7010 (Zybo dev board) 编译和运行 C 代码不使用 Xilinx 工具链 (Vivado/SDK)
  2. 是否可以在 Zynq 上汇编和运行 ARM 汇编代码 (Thumb2)不使用 Xilinx 工具链 (Vivado/SDK)?我的意思是编写一个不使用任何 Xilinx 驱动程序库或自动生成的初始化代码的程序(即构建您自己的简单向量表,为各种异常处理程序提供定义等)
  3. 如果不能,是否至少可以从 SDK 中组装和链接 ARM 汇编代码?

我正在帮助将一个介绍性嵌入式系统课程从 STM32F4(ARM M3 开发板)移植到 Zynq,前几周总是介绍组装。通常我们使用 arm-none-eabi 工具链从命令行手动执行所有操作,因此我有兴趣维护该结构,而不是立即跳入 Xilinx Vivado/SDK 环境。但是,如果没有 Xilinx 工具套件,我无法找到任何有关对器件进行编程的资源,我觉得这很奇怪。我无法想象这是不可能的,所以任何信息将不胜感激。

谢谢!

【问题讨论】:

    标签: assembly arm xilinx vivado zynq


    【解决方案1】:

    我没有使用 ZyBo 的直接经验,但是我多次遇到类似的情况,我学会了如何从互联网(甚至在互联网之前)收集信息并用一些逆向工程,然后是反复试验。

    我收集了我认为有用的信息,但我从未拥有过 ZyBo,因此请谨慎对待。
    另外,如果您不了解某些术语,请花时间阅读链接的文档。


    似乎可以避免部分 Vivado SDK 和 IDE,附录 A 中的Zynq 7000 Software Developer guide 描述了使用bootgenBIF 文件生成启动映像。

    在 Zybo 术语中,引导映像包含 BootROM 标头和第一阶段引导加载程序(引导过程的第一阶段,它还包含用户代码)。
    请注意,BootROM 本身是不可写的,因此除非您找到破解它的方法,否则您无法更改阶段 0(虽然这不是一个好主意,阶段 0 只做最少的工作并使板可用)。

    取自该手册的示例

    // A simple BIF file example.
    the_ROM_image:
     {
     [init]init_data.int
     [bootloader]myDesign.elf
     Partition1.bit
     Partition1.rbt
     Partition2.elf
    }
    

    并且手册明确指出ELF 是受支持的文件格式(至少我希望它是那个 ELF)。

    因此您可以使用 GCC 生成 ARM ELF,然后使用 bootgen 生成引导映像(当然没有 C 运行时)。
    也支持二进制文件,因此任何 ARM 汇编程序都可以。
    这应该避免任何 SDK 初始化代码,只在代码之前执行阶段 0。

    Zynq 7000 Technical Reference Manual 详细描述了 BootROM 标头格式。
    它还解释了各种硬件组件和做出的架构决策,包括启动过程和各种裸机选项。
    因此,您甚至可以摆脱 bootgen 并制作自己的工具。

    在 XIP 模式下,BootROM 标头似乎有一个定义中断表的字段,但是,如上所述,它是 BootROM 执行的第一个代码,因此您不必从 ARM 复位向量开始。


    熟悉 SDK,但我敢肯定,如果您窥探 SDK bin 文件夹,您会发现很多用于 ARM 工具链的常用 GNU 工具(几乎就像它发生在 Android NDK 上一样)。
    XILINX 在其一份文件中(唉,我不记得是哪一份了)声明他们使用了标准 GNU 工具,并进行了轻微的扩充。

    至于避免使用 XILINX 库,您可以尝试阅读它们的源代码(如果可用)或反汇编它们的二进制文件。
    在技​​术参考手册的帮助下,您应该能够首先避免它们。


    XILINX 在链接的两个文档(shorter one is here)上很好地描述了它的董事会,阅读这两个文档将解释很多事情。

    通常供应商会重用现有工具,因此,除非 XILINX 自己开发,否则您应该会发现 IDE 使用的命令行工具很熟悉。
    在深入了解 Vivado SDK 的工作原理后,您甚至可能会开始喜欢它!

    【讨论】:

    • 非常感谢您提供的信息。我已经对这两个文档进行了相当广泛的研究,它很好地解释了架构和“什么”,但是它们没有太多关于“如何”的信息(最值得注意的是,“如何”获得二进制到该死的东西上)在SDK环境之外做任何事情。
    • 能否请您在声明中澄清“无 C 运行时”的含义:“因此,您可以使用 GCC 生成 ARM ELF,而不是 bootgen 来制作引导映像(当然没有 C 运行时)。”
    • @Brett C 运行时(例如printf 等)与特定架构相关联。除非你有 ZyBo 的 C 库,否则你不能使用它们。
    • 好的,我明白你的意思了,我已经知道了。不找那个,只是一种将可执行​​的汇编指令放入程序内存中,然后初始化PS开始运行它的方法
    【解决方案2】:

    当我在寻找一种不使用 Xilinx SDK 开发软件的方法时,我找到了this repository。作者在汇编中编写了代码来初始化 SoC Zynq 7000,这样就可以在其上运行编译后的 C 代码。但是,作者仍然使用了 Xilinx SDK 中的工具链。

    我根据他的开发创建了一个新的存储库,并摆脱了 Xilinx SDK 依赖,转而使用 arm-none-eabi-gcc 和 arm-none-eabi-newlib。 OpenOCD 用于在此设备上运行软件。这是一个 git 存储库,其中包含有关如何在没有 Xilinx SDK 的情况下在 Digilent Zybo Z7-10 上运行示例的说明:https://github.com/3ap/zybo-z7-baremetal

    【讨论】:

      【解决方案3】:

      一般来说是的,绝对的。但这主要取决于零件的可用文档。您没有理由不能使用 gnu 或 llvm 工具来构建 arm 二进制文件,替换 sdks 所需的有关您正在与之交谈的信息。如果这只是您的逻辑包装的核心,那么您仍然需要他们的工具来使逻辑最有可能并将其放置在部件中(并且您可以控制地址和外围设备是什么,以便您可以编写代码来与您自己的逻辑对话,所以你自己记录),但是 arm 二进制文件,理论上你可以用任何工具制作,希望他们的工具不会阻止你使用这些二进制文件。

      【讨论】:

      • 好吧,这正是我所怀疑的。幸运的是,我现在对与 FPGA 逻辑的任何交互都不感兴趣,我只想能够在其中一个 CPU 上组装、链接和执行简单的汇编语言二进制文件。对于一个 cortex-M3 来说,这将是一项微不足道的任务,但我正在努力思考如何处理 zynq 所需的更广泛的启动。
      • 毫无疑问,Xilinx 已经“集成”了一系列工具,因此他们工具的输出“无缝”集成到 fpga 图像下载或其他内容中。我听说过但没有研究过 zynq 平台,但我想更多的是没有理由不能在 fpga 中实现一些允许你将程序插入 ram 然后在 arm 上释放重置的原因。基本上,正如您在某些基于 cortex-m 的 mcu 上所了解的那样,芯片公司已经构建了一个或几个接口来将程序下载到闪存中
      • 毫无疑问,赛灵思也有一些东西,但在他们的沙箱中。所以你必须看看你是否可以找出他们的沙箱并替换组件的输出或构建你自己的 arm 接口并使用它。如果幸运的话,也许您可​​以直接访问 SWD 信号,那么您可以使用 stlink 或 openocd 支持的调试器轻松获得的任何东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2021-04-16
      相关资源
      最近更新 更多