Embedded 在闪存中下载代码的过程

Embedded 在闪存中下载代码的过程,embedded,Embedded,我是嵌入式领域的新手。我对下载十六进制文件产生了一个疑问: 作为链接器和定位器的输出,是一个二进制文件,具有.text、.bss、.data等不同部分。text驻留在闪存中,.bss进入RAM,.data进入RAM。。。 所以我的问题是 如何将.bss和.data写入RAM,因为我正在使用FlashLoader将程序刻录到FLASH上 在最后的二进制文件中是否有任何索引类型的东西可以区分.text和.bss段 链接器/定位器中是否有将简单二进制文件转换为十六进制格式的实用程序 如何从十六进制文件

我是嵌入式领域的新手。我对下载十六进制文件产生了一个疑问: 作为链接器和定位器的输出,是一个二进制文件,具有.text、.bss、.data等不同部分。text驻留在闪存中,.bss进入RAM,.data进入RAM。。。 所以我的问题是

  • 如何将.bss和.data写入RAM,因为我正在使用FlashLoader将程序刻录到FLASH上
  • 在最后的二进制文件中是否有任何索引类型的东西可以区分.text和.bss段
  • 链接器/定位器中是否有将简单二进制文件转换为十六进制格式的实用程序
  • 如何从十六进制文件的内容中区分.text和.bss

  • 提前谢谢。请提供帮助。

    通常,这些问题可以通过用于管理目标设备的嵌入式工具来解决

    对于小型嵌入式设备(小于16K到128K的RAM和ROM/NVRAM),代码直接从NVRAM执行。初始化代码将初始化的数据复制到RAM中,可能对其进行解压缩,并初始化未初始化的RAM,通常是通过清除它。定位器负责使所有数据引用访问正确的目标地址,而不是ROM数据的地址

    大型嵌入式设备的运行速度比NVRAM快得多,因此它们往往是在NVRAM内容(代码加数据)从NVRAM复制到RAM以执行的情况下实现的

    要回答您的其他问题:

    2) 最后的二进制文件经过精心构造,以区分程序段。有许多不同的文件格式。有关格式的详细信息,请参阅相应的Wikipedia文章

    3) 您不需要转换为十六进制格式,尽管这取决于您的目标加载器。例如,基于U-Boot的系统支持二进制数据的文件传输

    4) 见第2段)

    1.)在我使用FLASH Loader将程序刻录到闪存上时,如何将.bss和.data写入RAM


    代码、常量数据和初始化数据都写入闪存。在运行时,初始化的数据在启动期间复制到bss。常量数据通常直接访问(使用“const”关键字声明)

    2.)在最终二进制文件中是否有任何索引类型的东西可以区分.text和.bss段

    我想你所说的“二进制”是指链接器的输出。这通常称为对象文件,与二进制图像不同。目标文件包括所有代码、数据、符号、调试信息和内存地址。对于GCC工具链,链接器输出通常是一个.elf文件

    链接器使用“链接脚本”或其他定义文件在适当的内存地址定位各个段。你的工具链应该有关于如何改变的文档

    3.)链接器/定位器中是否有将简单二进制文件转换为十六进制格式的实用程序

    “objcopy”实用程序将读取链接器输出,并可以写入多种格式的输出文件,包括英特尔十六进制。有关人类可读的输出,请参阅“objdump”

    4.)如何从十六进制文件的内容中区分.text和.bss

    通过内存地址。GCC对复制到bss的数据使用“初始化数据”段。它是根据链接器脚本定位的

    英特尔十六进制格式:


    GCC:

    您的编程工具只需将程序映像(十六进制或二进制文件)写入指定地址的闪存中

    编译器编译程序时,会将包含
    .bss
    .data
    等信息的信息(查找表)与一些C启动代码一起添加到hex文件中。在C
    main()
    函数开始之前运行的C启动代码负责根据闪存中查找表中的信息初始化
    .bss
    .data
    。通常,这意味着:

    • .bss
      初始化为零
    • .data
      的初始化值从闪存复制到RAM中的适当位置。
      • (在某些平台上,初始化值甚至可能被压缩存储以节省闪存中的空间,启动代码在将其写入RAM时对其进行解压缩)
    在某些平台上,出于各种原因,您可能希望在RAM中运行代码。C启动代码也可以以类似的方式将代码从闪存复制到RAM

    C启动代码还可以做其他重要的事情:

    • 初始化堆栈和初始堆栈指针
    • 初始化堆(如果程序使用)
    • 设置一些基本的处理器配置,如处理器操作模式、时钟速度、闪存等待状态、内存管理单元等

    二进制文件不是目标文件,目标文件是链接器输入,二进制/可执行文件是输出。这只是令人困惑,因为ELF格式可用于对象文件和可执行文件。“在运行时,初始化数据在启动时复制到bss。”bss在启动时用零填充,初始化数据复制到数据段。