Embedded 在闪存中下载代码的过程
我是嵌入式领域的新手。我对下载十六进制文件产生了一个疑问: 作为链接器和定位器的输出,是一个二进制文件,具有.text、.bss、.data等不同部分。text驻留在闪存中,.bss进入RAM,.data进入RAM。。。 所以我的问题是Embedded 在闪存中下载代码的过程,embedded,Embedded,我是嵌入式领域的新手。我对下载十六进制文件产生了一个疑问: 作为链接器和定位器的输出,是一个二进制文件,具有.text、.bss、.data等不同部分。text驻留在闪存中,.bss进入RAM,.data进入RAM。。。 所以我的问题是 如何将.bss和.data写入RAM,因为我正在使用FlashLoader将程序刻录到FLASH上 在最后的二进制文件中是否有任何索引类型的东西可以区分.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文件中。在Cmain()
函数开始之前运行的C启动代码负责根据闪存中查找表中的信息初始化.bss
和.data
。通常,这意味着:
- 将
初始化为零.bss
- 将
的初始化值从闪存复制到RAM中的适当位置。.data
- (在某些平台上,初始化值甚至可能被压缩存储以节省闪存中的空间,启动代码在将其写入RAM时对其进行解压缩)
- 初始化堆栈和初始堆栈指针
- 初始化堆(如果程序使用)
- 设置一些基本的处理器配置,如处理器操作模式、时钟速度、闪存等待状态、内存管理单元等