有人可以解释一下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上,这是我最初处理此问题的地方...我认为这很简洁