1) 对于所有平台都需要进行一些组装,你可能需要一些启动代码来覆盖编程语言的假设,例如C编译器假设您已设置堆栈指针,并将.bss内存归零,.data处于正确位置等。根据处理器的不同,但通常情况下,您可能需要一些用于中断处理和任务切换等的代码。
2) 是的,有许多虚拟机,如qemu、skyeye等。
3) 几乎没有一种指令集模拟器或虚拟机等能完全匹配处理器。仅仅因为在虚拟机/模拟器上运行正常并不意味着它在实际处理器上也会正常运行。这与在调试程序中运行和在调试器之外运行代码没有什么区别。您应该尝试不同的模拟器以及硬件来验证模拟器的质量。一个ARM处理器与另一个ARM处理器或一个x86处理器与另一个x86处理器可能存在足够的差异,导致软件失败,即使在硬件上运行也无法解决所有潜在的错误。
4) Linux运行在许多平台上,是吗? NetBSD运行在更多平台上,是吗? 根据您设计程序的方式,它可以非常易于移植或不易于移植,任何中间状态都可能。这取决于您自己。
5) 您需要一些操作系统基础知识,可以获取MicroC/OS-II书籍或其他类似材料。学习一下任务切换等基础知识。
6) IDE(集成开发环境)和编辑器等是非常个人化的东西,一个人喜欢的工具可能会被其他人所讨厌。对于ARM开发来说,你需要获取ARM ARM(ARM体系结构参考手册)。由于有太多不同的核心和家族,原来的单一文档现在已经拆分了。看起来最古老的版本是ARMv5或ARMv6 ARM,这是曾经的单一版本。获得这个版本后,你至少可以编写更加可移植的ARM核心代码。你还需要获取一些TRM(技术参考手册),比如ARM7TDMI(ARMv4T)的TRM,就像从英特尔获取486手册一样,几乎所有32位ARM指令都向后兼容到该核心。可能还需要获取其他家族的TRM。要知道,即使较旧的版本(例如r1p0)可能被标记为过时,但如果存在相应版本的手册,ARM已将其出售给某人,并且它仍然存在于某些芯片中,你可能需要了解不同核心之间的差异(如果你需要精确地定位目标)。附加到某些核心的外设,例如pl310 L2缓存,你可能想知道其中的内容,如果你有兴趣启用和使用缓存。嗯,ARM7(ARMv4,不要与ARMv7混淆)没有mmu,而ARM9则有,所以根据你想要如何管理应用程序及其内存,你可能需要将ARM9或更新的版本作为基线。
获取Codesourcery Lite GNU工具链。Codesourcery现已成为Mentor Graphics的一部分。构建自己的ARM交叉编译器或获取其他(Emdebian等)并不难。ARM提供了一个不错的编译器,但它价格昂贵并且大多数支持将需要付费,当然可以通过在线搜索获得帮助,但大多数免费帮助是基于GCC的。LLVM编译器工具每天都在变得更好,据我了解,它们被用于iPhone上。我使用的是LLVM的一部分——Clang编译器。你不一定要从头开始构建交叉编译器,因为它们本身就是从语言到中间层再到目标汇编的交叉编译器。汇编和链接是针对主机的,但你可以使用GNU Binutils汇编器和链接器进行最后一步操作。
像IDE /编辑器一样,你的编程风格和偏好可能会倾向于使用某个编译环境。
你可能会发现我在Github上的ARM示例有用或没有用处,它们是低级别的板子启动类型示例。大多数是基于Thumb指令集,但尽可能也包括一些ARM指令集。