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