2017-02-03 68 views
0

我在一个简单的AVR编程器上为我的大学项目工作,并且我坚持了解如何将内存从十六进制文件映射到实际的闪存。AVR内存和英特尔十六进制

例如,intel hex为我们提供了关于数据块起始地址,其中的字节数和数据本身的信息。麻烦来自于AVR MCU,特别是ATmega16,通常有两个字节的地址:高和低。首先,我写了一个简单的函数,它只读取来自十六进制文件的所有数据并按顺序写入,每传递两个字节就增加一个地址。令我惊讶的是它在简单的闪烁代码上工作。但是,我不确定,如果这种方法可行,如果有人需要复杂的内存结构。

所以问题是:

  1. 将在复杂的存储器结构,该解决方案的工作?
  2. 如果不是,我该如何将intel十六进制地址映射到实际的flash地址?问题是在intel hex格式中没有高和低字节,只有地址=字节。

回答

0

Intel十六进制使用字节地址。 PC程序计数器是指16位字地址。如果您的单词地址是“实际地址”,那么只需加倍表示十六进制文件中该行起始地址的数字即可。

你是什么意思的“复杂的内存结构”?无论地址空间如何分解,内存位置都需要唯一的地址。我不熟悉程序存储器空间不以0开头并且线性延续,但如果有这样一个方案,intel hex文件中的一行可以指定从任何地址开始的任何连续存储器部分的内容。

编辑:

的Intel hex文件的每一行只能包含多达255个字节。通常,数据被分成16或32字节的块。每行包含块的起始地址(如果使用,则将其添加到基地址)。块不必在前一个块的末尾处开始,并且它们也可能无序。至于你描述的复杂内存结构,大多数程序已经有了它们。通常在开始时会有一个向量表,然后是一个间隙,然后是crt和主程序。数据来初始化全局变量。如果存在引导加载程序,则将其放在内存末尾的特殊部分。

+0

如果我在闪存末端创建一个自定义部分并在其中放置一些数据,那么在“复杂内存结构”下面就是这样的。其实它并不是很复杂;)所以我只需要将地址除以2就可以了? –