了解Arduino引导程序的闪存组成

时间:2017-09-21 14:37:08

标签: makefile arduino bootloader atmega

我试图理解Arduino引导程序。我在这里找到了一些介绍:Arduino Bootloader,但我需要更多细节,因此我会寻求帮助。

在我的研究过程中,我找到了一个起点:好的,Arduino(atmega系列)有一个专用于bootloader的特定闪存块。一旦mcu有一个引导加载程序,它就可以通过串口下载新程序并将其存储在闪存中,地址为0x00。

让我们为这个问题签署atmega328p。

#1 - 如果您查看第343页的数据表,您将看到一个表格,其中显示了有关引导加载程序大小的一些信息:

enter image description here

通过这个表我理解:如果我将BOOTSZ1 / 0设置为0/0,我可以有一个2K的引导程序,它将存储在闪存堆栈中:0x3800~0x3FFF。

#2 - 如果您打开Arduino生成的ATMEGA328_BOOTLOADER的hex文件,您将看到存储在以下位置的引导加载程序:

:10**7800**000C94343C0C94513C0C94513C0C94513CE1 

:10**7FF0**00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91

如果您考虑7FF0 - 7800,您将获得7F0(2K字节的程序)

#3 - 如果你打开makefile(C:\ Program Files(x86)\ Arduino \ hardware \ arduino \ avr \ bootloaders \ atmega),你会看到atmega328的这个参数:

atmega328: LDSECTION  = --section-start=.text=0x7800

其中0x7800与bootloader中的hexa文件匹配。

问题:

1-为什么数据表告诉我,我有一个特殊的地方用于bootloader和Arduino的makefile强制它存储在不同的地方?

2-什么意思是hexa文件的行?

:10E000000D9489F10D94B2F10D94B2F10D94B2F129

:10    : (?) 
E000   : Address
00     : (?)
0D9489F10D94B2F10D94B2F10D94B2F1   : data (?)
29     : CRC (?)

1 个答案:

答案 0 :(得分:1)

首先,我不确定我们是否有相同的atmel数据表;你的桌子在我的桌子上是27-7,但无论如何数据都是一样的。

免责声明:我对此并不是百分之百确定,但我非常自信。

我认为"问题"这是"单词"。阅读他们写的核心概述

  

大多数AVR指令都有一个16位字格式。每个程序存储器地址都包含一个16位或32位指令

这意味着指令宽度为2个字节。因此,您的地址0x3800对应于从内存开始的0x7000字节,而引导加载程序0x3FFF的末尾对应于字节0x7FFE和0x7FFF。

这由内存大小确认:0x7FFF对应32k,这是可用的闪存。由于引导加载程序位于内存的末尾(如DS中的图片所示),这意味着0x3FFF应该是最后一个内存单元。

编辑:

当我回答时,我没有阅读问题的第二部分。格式是所谓的英特尔二进制格式。有关详细信息,请参阅Wikipedia。这是一个简短的总结。

您正确识别了字段分割:

:      : Start code
10     : Number of data bytes (in this case: 16)
E000   : Starting address of the data bytes
00     : Record type (in this case: data)
0D9489F10D94B2F10D94B2F10D94B2F1 : data payload (in this case: 16 bytes)
29     : CRC

记录类型可以是

  • 00:数据
  • 01:文件结束
  • 02:扩展段地址
  • 03:启动段地址
  • 04:扩展线性地址
  • 05:开始线性地址

获得CRC总和所有字节(从长度1开始,所以最开始),然后得到LSB,最后得到2补码。在这种情况下,总和为2519,十六进制为0x9D7。低位字节D7对应于215.它的2补码可以计算为256 - x,所以41,这意味着0x29为十六进制。