AVR内存和英特尔六进制

问题描述 投票:0回答:2

我为我的大学项目做了一个简单的AVR编程器,我被如何将内存从16进制文件映射到实际的闪存所困扰。

例如,intel hex文件为我们提供了数据块的起始地址、字节数和数据本身的信息。问题在于AVR MCU,尤其是ATmega16,经常是一个地址对应两个字节:高字节和低字节。

起初,我写了一个简单的函数,只是从16进制文件中读取所有数据,然后按顺序写入,每通过两个字节就增加一个地址。令我惊讶的是,它可以在简单的闪烁代码上工作。然而,我不确定,如果有人需要复杂的内存结构,这种方法是否可行。

所以,问题是。

  1. 这个方案能不能在复杂的内存结构上工作?
  2. 如果不能,如何将英特尔十六进制地址映射成实际的闪存地址?问题是intel hex格式中没有高低字节,只有地址=字节。
memory hex avr atmega atmel
2个回答
0
投票

intel hex使用的是字节地址。PC程序计数器指的是16位字地址。如果你的意思是字地址是 "实际地址",那么只需将十六进制文件中代表行的起始地址的数字加倍即可。

什么叫 "复杂的内存结构"?内存位置需要唯一的地址,无论该地址空间如何分解。我不熟悉不从0开始并线性延续的程序内存空间,但如果有这样的方案,英特尔十六进制文件中的一行可以指定从任何地址开始的任何连续内存部分的内容。

编辑。

intel hex文件的每一行最多只能包含255个字节。通常情况下,数据被分割成16或32字节的块。每一行都包含分块的起始地址(如果使用的话,会加到基地址上)。一个分块不一定要从前一个分块的末尾开始,它们也可以没有顺序。

至于你所说的复杂的内存结构,大多数程序都已经有了。通常一开始会有一个向量表,然后是一个间隙,接着是crt和主程序。之后是初始化全局变量的数据。如果有bootloader,则放在内存最后的一个特殊部分。

© www.soinside.com 2019 - 2024. All rights reserved.