Arduino Bootloader详细信息


11

有人可以解释一下Arduino引导程序的工作原理吗?我不是在这里寻找高层次的答案,我已经阅读了代码,并明白了要点。我还阅读了一篇文章(我什至是其中的回应者之一)。

Arduino IDE和引导加载程序代码之间发生了许多协议交互,最终导致了许多内联汇编指令,这些指令通过在串行接口上​​传输的程序对闪存进行自编程。

我不清楚的是在第270行:

void (*app_start)(void) = 0x0000; 

...我将其识别为函数指针的声明以及对NULL的初始化。在引导加载程序将委托给用户加载的代码执行的位置,随后会调用app_start。

当然,某种程度上app_start需要某种方式获取非NULL值才能将它们全部组合在一起。我没有在引导加载程序代码中看到这一点...它是否与由引导加载程序加载的程序进行了神奇的链接?我认为引导加载程序的主要部分是芯片复位后进入软件的入口。

大约70行汇编中必须包含一个秘密的解码器环,该环告诉主程序app_start的实际位置在哪里?也许这是Arduino IDE所利用的一些隐性知识?我所知道的是,如果有人不将app_start更改为指向0以外的其他位置,则引导加载程序代码将永远永久旋转自身……那么诀窍是什么?

单独说明一下,引导加载程序代码是否有可能依赖于中断,还是不行吗?

编辑

我对尝试将引导加载程序移植到Tiny AVR(特别是ATTiny44A)感兴趣,该AVR没有单独的存储空间用于引导加载程序代码。对我来说显而易见的是,引导加载程序代码依赖于某些熔丝设置和芯片支持,我想我真的很想知道将引导加载程序移植到没有这些熔丝和硬件的芯片上需要做什么。支持(但仍然具有自编程功能)?

我以为我可以使用AVR307的实现将USI用作半双工UART(使用Timer0中断和引脚更改中断)。谁能提供有关如何为不支持引导加载程序的硬件编写/移植引导加载程序代码的指南?

我想我会将引导程序代码放在地址main的正常位置(例如0x029e或编译器放置main的任何地方)。然后,我将使引导加载程序代码中的“地址”添加一个偏移量,该偏移量使我刚好超过main的结尾,并将“ app_start”设置为该地址。我是在正确地考虑这个问题还是我完全错过了什么?谢谢!

编辑2

FWIW,我找到了一个文档化的程序,程序用于将Arduino草图加载到ATTiny85上,这是我最初处理此问题的地方...我认为这很简洁


Answers:


12
void (*app_start)(void) = 0x0000; 

这不是NULL指针。这实际上是引导程序跳转到的应用程序代码的起始地址。链接器安排您的应用程序代码从地址0开始。请参见ATMEGA168数据表中的表26-6。

引导加载程序代码从Flash的更高位置开始。确切的位置取决于引导加载程序的保险丝。


那么引导加载程序的主要代码在哪里...
vicatcu 2010年

1
@Joby,嗯,好吧...请参阅我的问题的更新-我有兴趣尝试将Bootloader移植到Tiny AVR,后者没有用于Boot loader代码的单独内存空间。
vicatcu 2010年

1
@Joby,因此引导加载程序代码依赖于“ ...可以对引导复位熔丝进行编程,以使复位向量在复位后指向引导闪存的起始地址。在这种情况下,引导加载程序在复位后启动。 ”
vicatcu 2010年

3
您是否特别想要Arduino引导程序?它模仿STK500编程器,因此体积较大。引导加载程序目录中有一个atmega8版本,可使用gcc-3编译为1K以下的版本,但是即使如此,您在可用闪存上也相当短。
彼得·吉布森

3
您甚至真的想要引导加载程序吗?对于ATTiny来说,肯定更值得您使用ICSP编程器(例如usbTinyISP)对设备进行编程
SingleNegationElimination
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.