AVR 内存和 intel hex

AVR memory and intel hex

我在为我的大学项目开发​​一个简单的 AVR 编程器,但我一直无法理解如何将内存从十六进制文件映射到实际闪存。

例如,intel hex为我们提供了数据块的起始地址,其中的字节数和数据本身的信息。问题来自 AVR MCU,尤其是 ATmega16,通常有两个字节的一个地址:高位和低位。

起初,我写了一个简单的函数,它只是从十六进制文件中读取所有数据并顺序写入,每传递两个字节地址增加一个。令我惊讶的是,它适用于简单的眨眼代码。但是,我不确定这种方法是否可行,是否有人需要复杂的内存结构。

所以问题是:

  1. 此解决方案是否适用于复杂的内存结构?
  2. 如果不是,我如何将 intel 十六进制地址映射到实际的闪存地址?问题是intel hex格式没有高低字节,只有address = byte.

Intel hex 使用字节地址。 PC 程序计数器引用 16 位字地址。如果您的意思是字地址是 "actual address",那么只需将表示十六进制文件中行的起始地址的数字加倍即可。

"complex memory structures" 是什么意思?内存位置需要唯一地址,无论该地址 space 是如何分解的。我不熟悉不以 0 开头并线性继续的程序内存 spaces,但是如果有这样的方案,intel hex 文件中的一行可以指定从以下位置开始的任何连续内存部分的内容任何地址。

编辑:

intel hex 文件的每一行最多只能包含 255 个字节。通常,数据被分成 16 或 32 字节的块。每行包含块的起始地址(如果使用则添加到基地址)。块不必从前一个块的末尾开始,它们也可以乱序。

至于你描述的复杂内存结构,大多数程序已经有了。开头一般有一个vectortable,后面是一个gap,后面是crt和main program。初始化全局变量的数据如下。如果有bootloader,则放在内存末尾的特殊段。