没有Vivado / SDK的Zynq上的裸机装配程序

时间:2017-01-19 20:56:00

标签: assembly arm xilinx vivado zynq

对于那些熟悉Xilinx Zynq及相关设计工具的人,我有一个问题....

  1. 是否可以为Zynq 7010(Zybo dev board)编译并运行 C代码不使用Xilinx工具链(Vivado / SDK)?< / LI>
  2. 是否可以在Zynq上组装并运行 ARM汇编代码(Thumb2)不使用Xilinx工具链(Vivado / SDK)?我的意思是编写一个不使用任何Xilinx驱动程序库或自动生成的init代码的程序(即构建自己的简单向量表,为各种异常处理程序提供定义等)。
  3. 如果没有,是否可以至少从SDK中组装和链接ARM汇编代码?
  4. 我帮助将STM32F4(ARM M3开发板)的入门级系统课程移植到Zynq,前几周始终是汇编的介绍。通常我们使用arm-none-eabi工具链从命令行手动执行所有操作,因此我有兴趣维护该结构,而不是立即跳转到Xilinx Vivado / SDK环境。但是,如果没有Xilinx工具套件,我无法找到任何有关器件编程的资源,我觉得这很奇怪。我无法想象它是不可能的,所以任何信息都会受到高度赞赏。

    谢谢!

3 个答案:

答案 0 :(得分:3)

我对ZyBo没有直接的经验,但是我遇到过类似的情况不同时间,我学会了如何从互联网上收集信息(甚至在互联网之前)并填补空白一些逆向工程,然后是反复试验。

我收集了我认为有用的信息,但我从来没有过ZyBo,所以请带上一粒盐。
此外,如果您不理解某些术语,请花时间阅读链接文档。

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

在Zybo术语中,启动映像包含BootROM头和第一阶段Bootloader(引导过程的第1阶段,它还包含用户代码)。
请注意,BootROM本身是不可写的,所以你不能改变阶段0,除非你找到一种方法来破解它(虽然这不是一个好主意,但是阶段0只做了很少的工作并使电路板可用)。 / p>

从该手册中取得的一个例子

// 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并制作自己的工具。

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

熟悉SDK,但我确信如果你窥探SDK bin文件夹,你会发现很多常用的GNU工具ARM工具链(非常类似于Android NDK) XILINX在其中一篇文章(唉,我不记得哪一篇)中说,他们使用了标准的GNU工具,并略有增强。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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