我正在尝试将两个程序加载到AVR芯片上,但我找不到任何有关如何执行此操作的资源。
这样做的目的是让芯片开始运行第一个程序,第一个程序跳转(使用汇编)到第二个程序(在内存中的第二个点加载)。我知道这听起来毫无用处,但我想稍后实现它还有更大的意义。
有没有办法在内存中的指定点加载程序并完成此任务?或者有没有办法生成一个可以执行此操作的hex文件?
提前致谢,我希望这是有道理的。
答案 0 :(得分:4)
这听起来像一个引导程序。我已经在Microchip的PIC中实现了这一点,而不是AVR,但诀窍在于链接器文件。
引导加载程序在加电时运行。它寻找新的应用程序固件来刻录到闪存中。如果没有新固件,它会查看是否有新的应用程序固件。如果有,则跳转到应用程序的重置向量。应用程序开始运行,好像它只是一个加电。
技巧是引导加载程序和应用程序的链接器文件耦合在一起。引导加载程序保留地址0x0000到0x0FFF。应用程序保留地址0x1000到0xFFFF。引导加载程序和应用程序也需要就应用程序的启动位置达成一致。它可能不是地址0x1000。
答案 1 :(得分:1)
代码的起始地址通常由链接描述文件或设置决定。工具链的默认设置是从复位运行(即复位向量将指向代码的起始地址)。您的辅助程序需要位于不同的内存空间(通过链接器设置),您的主程序只需要跳转到第二个程序。
有些人可能需要警惕;您的主程序可能不会使I / O和外围设备处于“重置”状态,因此您的二级程序不应做出任何假设。在进行跳转之前,禁用可能产生中断的任何外设可能很重要。
就组合十六进制文件而言,如果您小心并准备好使用SRecord tool手动或更灵活地(并且不易出错)解释十六进制记录,则可以使用文本编辑器轻松实现。
您可能遇到的一个问题是,虽然代码本身可能是单独定位的,但AVR中的向量表是固定的,并将在两个程序之间共享。两个程序的中断向量表必须相同,并且必须共享处理程序 - 如果处理程序需要与“正在运行”的程序进行通信,则这并不简单。最简单的解决方案是安排它,以便只有一个程序使用中断。 SRecord将有用地解决或警告两个hex文件定义重叠内存区域的冲突,并且我认为您可以安排它以便一个文件覆盖另一个文件。
答案 2 :(得分:0)
我也将此技术用于PIC处理器上的bootloader plus应用程序。正如前面提到的海报所述,问题的第一部分是使用链接器定位两个程序,使它们不重叠。在单独构建两个程序后,我使用Hexmate将两个程序的hex文件合并为一个hex文件。您可以在http://www.schmalzhaus.com/Tools/HexmateInstructions.html
获取适用于Windows PC的此实用程序的副本