用C编写并在其他IDE/计算机上编译(或交叉编译(的程序,然后作为二进制数据加载到控制器的闪存中。
我在裸机/无实时操作系统中有什么不明白
的- 哪个程序/代码负责从闪存加载到RAM?
- 微控制器中的RAM是否具有智能/程序来理解二进制文件,或者在编译时,编译器将智能添加到二进制文件中?
理想情况下,您的程序在闪存而不是 ram 中运行。您可以使用许多 MCU,如果不支持从 ram 运行,这将主要是架构限制。 在紧要关头,如果您需要蹦床来重新编程闪存,例如在现场下载新固件(对于只有一个闪存组的芯片无法同时运行和擦除/修改(,或者为了性能,但如果您需要 ram 来提高性能,那么也许您需要重新考虑您的设计。 当然有小部分,但如果整个应用程序出于开发以外的原因必须位于 RAM 中,则需要重新考虑您的系统设计。
您可以轻松地用一个小副本来包装程序以 ram 位代码,以便 mcu 启动复制和跳转程序,然后主应用程序在 ram 中运行。 这是你的选择。只有几行代码有点微不足道。 它是芯片/架构,取决于在这种情况下是否可以处理中断,或者你需要如何设计它(例如,不仅仅是复制和跳转,可能需要闪存中的处理程序也可以跳到RAM(。
这里没有魔力,MCU处理器与其他处理器没有什么不同,您需要一些非易失性的方式来将程序放入其中。 像大多数其他 cpu 一样,您的处理器从 rom/flash 启动,然后根据需要它适用于最终应用程序,无论它是否是操作系统。 对于MCU,典型的方法是直接启动到应用程序中,在闪存中运行只读项目(.text和.rodata(和RAM中的读写(.data,.bss(,这是通过知道如何使用工具链来处理的,这是裸机成功的关键部分。
CPU一般不在乎闪存、RAM、外围设备,它们只是地址,CPU非常非常笨。 你程序员很聪明,你为CPU铺设了要遵循的轨道,指令必须遵循规则并指导处理器。 处理器以众所周知的方式从一个众所周知的地址或矢量表启动,从那里开始,您可以通过在有资源、闪存、RAM 和外围设备的地址空间内工作来保持处理器的正常运转。处理器可能具有有关它可以从中获取/执行的地址空间的规则,或者不获取/执行,这取决于实现。 对于可执行地址空间同时具有闪存和 ram 的实现,是的,您可以简单地将代码放在 ram 中并执行它。
在 MCU 上的 ram 中运行代码是例外而不是规则。
-
通常,微控制器不会将(单个(程序加载到RAM中。相反,它在(闪存或任何其他非易失性(内存中"就地"运行。程序的构建使得(固定(开始地址的内存包含程序的启动代码。
话虽如此,您可能想知道(静态(变量如何用零和非零值初始化。这是通过构建程序时链接的启动代码完成的。
-
没有必要添加任何"智能",假设你的意思是像字节码解释器这样的东西来执行二进制命令。微控制器的CPU直接执行机器代码。您的编译器会准确生成机器代码。