Embedded h,以便更快地启动。这些只是一些例子,还有其他考虑因素

Embedded h,以便更快地启动。这些只是一些例子,还有其他考虑因素,embedded,bootloader,u-boot,Embedded,Bootloader,U Boot,RAM是易失性的,所以它不会在整个电源循环中保留代码。如果系统执行RAM中的代码,则需要引导加载程序在通电时获取代码并将其写入RAM。闪存是非易失性的,因此可以在通电时立即开始执行,不需要引导加载程序(但可能仍然有用) 关于第三季度,答案是肯定的。如果系统是从RAM运行的,则.text将位于RAM中(但直到引导加载程序将其复制到RAM中)。如果系统从闪存运行,则.text部分将位于闪存中。.bss部分是变量,无论.text部分在哪里,.bss部分都将在RAM中。我想补充一些关于问题Q2的内容 问

RAM是易失性的,所以它不会在整个电源循环中保留代码。如果系统执行RAM中的代码,则需要引导加载程序在通电时获取代码并将其写入RAM。闪存是非易失性的,因此可以在通电时立即开始执行,不需要引导加载程序(但可能仍然有用)


关于第三季度,答案是肯定的。如果系统是从RAM运行的,则.text将位于RAM中(但直到引导加载程序将其复制到RAM中)。如果系统从闪存运行,则.text部分将位于闪存中。.bss部分是变量,无论.text部分在哪里,.bss部分都将在RAM中。

我想补充一些关于问题Q2的内容

问题2:为什么引导加载程序需要将应用程序复制到RAM,然后从RAM运行应用程序?如果我们的应用程序运行于FLASH,我们将面临哪些困难

这不仅仅是关于拥有SPI或类似的串行外部代码内存(无论如何,这并不常见)

即使是连接到普通高速并行总线的外部ROM/FLASH/EPROM/也会由于外部存储器访问时间而阻止系统在最大时钟(零等待状态)上运行,即使在相对较慢的MCU上也是如此。100 MHz时钟需要10 ns的闪存访问时间,这并不容易(如果经济上可行的话)。你会同意,100兆赫不再是大脑旋转的速度:-)

这就是为什么许多MCU/CPU架构都在耍花招,一次读取乘法指令,或者拥有内部现金,或者做任何需要的事情来补偿缓慢的外部代码内存。只有最旧的8位体系结构可以直接从闪存(“就地”)执行代码

即使您唯一的代码内存是内部闪存,也需要做一些事情来加速它。以本文为例:

它描述了ARM7是如何集成了他们称之为MAM(内存加速模块)的东西的。这是一本很好的读物,您会发现一些措施可以加快特定ARM7体系结构的代码内存访问(适用于大多数其他体系结构):

  • 限制最大时钟频率(对于本文中的示例,从80 MHz到大约20 MHz)
  • 在闪存访问期间插入等待周期
  • 使用指令缓存
  • 将程序代码从闪存复制到RAM
  • 显然,如果指令缓存不是一个选项(太小,或者时钟太高),那么在启动时重新定位代码之后,实际上只剩下RAM执行了

    还有一个选项可以只运行RAM中的特定代码段,该代码段可以指定给链接器。对于DSP(数字系统处理)系统,即使在时钟只有几十兆赫的旧时代,也没有选择从EPROM/FLASH运行,更不用说现在了


    另一个问题是调试,调试ROM甚至闪存中的代码的选项非常有限(您必须将代码的一部分移动到RAM中,才能在大多数系统上设置断点)。

    关于第二季度,您可能面临的困难之一是从闪存执行另一个代码更新。如果您正从尝试更新的同一闪存块执行,系统将崩溃。这取决于您的系统架构(应用程序和引导加载程序在Flash中的组织方式),但如果您试图更新引导加载程序本身,则可能很难避免