Memory AVR内存和英特尔十六进制

Memory AVR内存和英特尔十六进制,memory,hex,avr,atmega,atmel,Memory,Hex,Avr,Atmega,Atmel,我为我的大学项目做了一个简单的AVR程序员,我一直在理解如何将内存从十六进制文件映射到实际的闪存 例如,“英特尔十六进制”为我们提供了有关数据块的起始地址、数据块中的字节数以及数据本身的信息。问题来自AVR MCU,特别是ATmega16,通常有一个地址对应两个字节:高和低 首先,我编写了一个简单的函数,只需从hex文件中读取所有数据并按顺序写入,每传递两个字节,地址就增加一个。令我惊讶的是,它在简单的闪烁代码上工作。然而,我不确定这种方法是否有效,是否有人需要复杂的记忆结构 因此,问题是: 这

我为我的大学项目做了一个简单的AVR程序员,我一直在理解如何将内存从十六进制文件映射到实际的闪存

例如,“英特尔十六进制”为我们提供了有关数据块的起始地址、数据块中的字节数以及数据本身的信息。问题来自AVR MCU,特别是ATmega16,通常有一个地址对应两个字节:高和低

首先,我编写了一个简单的函数,只需从hex文件中读取所有数据并按顺序写入,每传递两个字节,地址就增加一个。令我惊讶的是,它在简单的闪烁代码上工作。然而,我不确定这种方法是否有效,是否有人需要复杂的记忆结构

因此,问题是:

  • 这个解决方案对复杂的内存结构有效吗
  • 如果不是,如何将intel十六进制地址映射到实际闪存地址?问题是英特尔十六进制格式中没有高字节和低字节,只有地址=字节

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

    你说的“复杂记忆结构”是什么意思?内存位置需要唯一的地址,不管地址空间是如何划分的。我不熟悉程序内存空间不是以0开始并线性延续的,但如果有这样的方案,则intel十六进制文件中的一行可以指定从任何地址开始的任何连续内存段的内容

    编辑:

    “英特尔十六进制”文件的每一行最多只能包含255个字节。通常,数据被分成16或32字节的块。每行包含区块的起始地址(如果使用,则添加到基址)。一个块不必从前一个块的末尾开始,而且它们也可能出现顺序错误


    至于您描述的复杂内存结构,大多数程序已经有了它们。通常在开始时有一个向量表,后面是一个间隙,后面是crt和主程序。初始化全局变量的数据如下所示。如果有一个引导加载程序,它将被放置在内存末尾的一个特殊部分。

    如果我在闪存末尾创建一个自定义部分,并将一些数据放在那里会怎么样,类似这样的内容是指“复杂内存结构”下的内容。其实并不复杂;)所以我只需要把地址除以2,就是这个?