【问题标题】:How to set up a dev. environment for ARM board AT91SAM7-EX256 under x86 Linux?如何设置开发。 x86 Linux下ARM板AT91SAM7-EX256的环境?
【发布时间】:2011-05-15 21:45:03
【问题描述】:
我是嵌入式开发的新手,如图所示。我有一个小型 ARM 板,AT91SAM7-EX256。我也有一个 JTAG 编程器加密狗。我在笔记本电脑和台式机上使用 Linux (Ubuntu x86_32)。我正在使用CodeSourcery Lite 交叉编译到 ARM-Linux。
我不能使用这个 Linux 目标交叉编译器为小型 ARM 板(它没有任何操作系统)制作二进制或十六进制文件,对吗?我应该改用名为ARM EABI 的版本吗?
正如我所见,它是一个“通用”ARM 编译器。我已经阅读了一些文档,并且有很多选项可以指定处理器类型和指令集(拇指等),不会有任何问题。但是我如何告诉编译器,特定板(启动、代码/数据块等)的图像(bin/hex)应该如何? (在汇编程序中,有 org 和 load 指令。)
我需要什么软件才能从我的 PC 上的板上捕获一些调试消息?我不想板载调试,我只需要一些详细的运行时信号,而不仅仅是闪烁的 LED。
我可以选择使用 MS-Windows,我可以为它买一台专用机器。推荐一下,是不是容易多了?
我可以在我的 C 代码中以某种方式使用内联汇编吗?我对此一无所知。我可以使用 C++ 还是只使用 C?
我还有一个问题,不需要回答:真的有 4096 种 GNU 编译器和交叉编译器(从 Linux_x86_32 -> Linux_x86_32, Linux_x86_32 -> Linux_ARM, OSX -> Linux_ARM, PPC_Linux -> OSX ) 和 16 个不同的 GNU 编译器源(存在许多目标平台/处理器)?标志说“是”,但我不敢相信。纠正我,告诉我可以为任何平台/处理器生成目标文件的 GNU 编译器,以及可以为任何平台生成可执行文件的通用链接器。
【问题讨论】:
标签:
embedded
arm
cross-compiling
【解决方案1】:
虽然在 Windows 上进行这种嵌入式开发并不是一个“更好”的平台,但它可能更容易开始,因为您可以获得一个预构建的环境来使用。例如,Yagarto(我会推荐)。
在 Linux 上设置嵌入式开发环境可能需要大量知识,但这并非不可能。
回答您的问题:
您的 Linux 交叉编译器带有用于为 Linux 环境构建可执行文件的库。您已经暗示要为该板构建一个裸机可执行文件。虽然你可以用你的编译器做到这一点,但它只会让事情变得混乱。我建议构建一个裸机交叉编译器。由于您正在构建自己的裸机可执行文件(因此您是操作系统,因此 ABI 并不重要,因为您正在生成所有代码,而不是与其他先前构建的代码互操作。
有多个版本的 ARM 指令集(和 Thumb)。您需要为您的特定处理器生成代码。如果您为较新版本的指令集生成代码,您可能会生成生成保留指令异常的代码。大多数用于 ARM 的预构建 gcc 交叉编译器工具链都是“multilib”,将针对 ARM 和 Thumb 中的各种架构进行构建。
不确定您在此处寻找的确切内容。这是一个裸机平台。如果您在目标上进行调试,则可以使用调试器通道发送消息,或者您需要在您编写的固件中构建自己的通信通道(即支持 uart)。
见上文。
是的。有关 gcc 的扩展内联汇编语法的详细信息,请参阅 here。您可以在 C++ 和 C 中执行此操作。您也可以简单地链接纯汇编文件。
没有通用的 gcc 编译器/链接器。您需要为您使用的每个主机/目标组合使用一个独特的编译器。
最后,请看Atmel's documentation。他们有大量关于为此目标进行开发的信息,以及带有所需链接器指令和示例程序的板包。请注意,该软件包当然适用于 Atmel 自己的评估板,但它可以帮助您入门。
【解决方案2】:
http://sam7stuff.blogspot.com/
我使用任何一个 codesourcery lite 版本。但是我对 gcc 库和 C 库都没有用,我只需要一个编译器。
在 gcc 3 天中,newlib 很棒,修改两个值得系统支持的文件(简单的打开、关闭、读取、putc 类型的东西),你几乎可以编译任何东西,但是使用 gcc 4.x 你甚至无法返回并交叉编译 gcc 3.x,您必须在虚拟机中安装旧的 linux 发行版。
要获得 gcc 库,是的,您可能希望使用 eabi 版本,而不是文件名中带有 linux gnueabi 的版本。
你也可以考虑llvm(如果你不需要C库,你仍然需要binutils),嗯,我想知道newlib是否用llvm编译。
我更愿意避免陷入沙箱,学习工具以及如何操作链接器等来构建您的二进制文件。