2017-09-21 133 views
1

我想了解Arduino引导程序。我在这里找到了一些介绍:Arduino Bootloader,但我需要更多的细节,因此我寻求帮助。了解Arduino引导程序的flash构成

在我的研究中,我发现一个起点:好的,Arduino(atmega家族)有一个专用于引导加载程序的特定闪存块。一旦该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 - 如果你打开生成文件(C:\ Program Files文件(x86)的\的Arduino \五金\ Arduino的\ AVR \引导程序\ ATMEGA),你会看到这样的说法对atmega328:

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

0x7800与bootloader的hexa文件相匹配。


问题:

1为什么数据表告诉我,我有一个特别的地方,引导程序和Arduino的的makefile文件强制存储在不同的地方?

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

:10E000000D9489F10D94B2F10D94B2F10D94B2F129 

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

回答

1

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

声明:我不是100%确定这一点,但我很有信心。

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

大多数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获得求和的所有字节(从长度方向的一个开始,所以一开始)的线性地址,然后让该LSB,最后使2补充。在这种情况下,总和为2519,即十六进制中的0x9D7。低位字节D7对应于215,其2补码可以计算为256-x,即41,这意味着十六进制中的0x29。