AVR 内存和英特尔十六进制

Posted

技术标签:

【中文标题】AVR 内存和英特尔十六进制【英文标题】:AVR memory and intel hex 【发布时间】:2017-02-03 17:56:28 【问题描述】:

我为我的大学项目开发​​了一个简单的 AVR 程序员,但我一直在理解如何将内存从 hex 文件映射到实际的闪存。

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

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

所以问题是:

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

【问题讨论】:

【参考方案1】:

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

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

编辑:

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

至于你描述的复杂的内存结构,大多数程序已经有了。开头通常有一个向量表,后面是一个gap,后面是crt和main程序。初始化全局变量的数据如下。如果有引导加载程序,则将其放置在内存末尾的特殊部分中。

【讨论】:

如果我在闪存的末尾创建一个自定义部分并在那里放置一些数据会怎样,这样的东西在“复杂的内存结构”下是什么意思。实际上它并不是很复杂;)所以我只需要将地址除以二,就是这样吗?

以上是关于AVR 内存和英特尔十六进制的主要内容,如果未能解决你的问题,请参考以下文章

在 ARM 的 iHex 程序中,英特尔十六进制记录类型 03 或 05 是做啥的?

使用 Python 运行英特尔 Fortran 二进制文件

英特尔 SGX:从 enclave 二进制文件复制 enclave 测量值

20171113曾英特《逆向及Bof基础实践》实验报告

eclipse的内存视图中的十六进制表示错误

检查内存时gdb如何显示十六进制和ASCII?