编译器如何在嵌入式系统中将数据放在ROM中?

How can compiler place data on ROM in embedded system?

据我所知,在嵌入式系统中,常量值、变量的初始化数据会被编译器放在ROM(Read Only Momory)中。但是,ROM是Read-only的,就是不能写,那么编译器怎么能在编程的时候写这些数据呢?

我认为这个嵌入式系统案例中的ROM主要是指关于EEPROM或闪存的写入权限的意思。

我的理解在带 OS 和不带 OS 的嵌入式系统中是否正确?

"read only" 部分更多地是关于现场可编程性而不是一般的可写性。从广义上讲,ROM 分为三种类型:

  • 作为制造过程的一部分进行编程且其内容不能更改的种类,例如mask ROM
  • 可以用专用设备擦除的那种,比如EPROM that can be erased with UV light;
  • 和可以电擦除的那种(一般在电路中),如EEPROM
  • 另外,请参阅下面@Olaf 留下的关于闪存和 EEPROM 之间差异的有用评论(无可否认,它们比我想象的要大!)

现在有很多微控制器——例如 Atmel 的流行 ATmega series – contain some on-chip flash memory for program storage, and may also contain EEPROM for nonvolatile data storage. These memories are written by hardware-specific device programmers

编译器、链接器和设备程序员共同负责确保将正确的数据或代码放入正确类型的内存中。例如,编译器可能发出将可执行代码放在 .text 部分的汇编指令。链接器组合了构成程序的目标文件的 .text 部分。最后,合并的 .text 被写入设备的闪存。

设备程序员显然需要了解可执行文件格式,以及段名称到内存类型的映射。或者,中间工具可以将可执行文件转换为程序员的输入文件。

But, ROM is Read-only, means that can't write so how can compiler can write these data when programming?

为了回答这个问题,编译器仅仅创建了目标文件。

这些被传递给链接器,链接器通常通过读取某种链接器脚本来决定变量将在哪个物理地址结束。链接描述文件可能会这样说:"program code goes into flash section 1, string literals go into flash section 2, const variables go into flash section 3"。链接器创建一些二进制文件格式。

二进制文件依次传递给芯片编程器工具或在线调试器,其中包含对闪存进行编程的实际例程。