【问题标题】:Understanding flash composition of Arduino bootloader了解 Arduino 引导加载程序的闪存组成
【发布时间】:2017-09-21 14:37:08
【问题描述】:

我正在尝试了解 Arduino 引导加载程序。我在这里找到了一些介绍:Arduino Bootloader,但我需要更多详细信息,因此我正在寻求帮助。

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

让我们为这个问题分配 atmega328p。


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

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


#2 - 如果你打开 Arduino 生成的 ATMEGA328_BOOTLOADER 的 hex 文件,你会看到 bootloader 存储在:

: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 与引导加载程序中的 hexa 文件匹配。


问题:

1- 为什么数据表告诉我我有一个特殊的引导加载程序位置,而 Arduino 的 makefile 强制它存储在不同的位置?

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

:10E000000D9489F10D94B2F10D94B2F10D94B2F129

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

【问题讨论】:

    标签: makefile arduino bootloader atmega


    【解决方案1】:

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

    免责声明:我对此不是 100% 确定,但我非常有信心。

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

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

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

    这通过内存大小来确认:0x7FFF对应32k,也就是可用的flash。由于引导加载程序位于内存的末尾(正如 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多