Answers:
使用的芯片要比代码所需的闪存多两倍。这样,您可以将新固件保存到该内存中,同时仍然保留旧固件,以防万一发生任何问题。
在解密并验证新固件上的校验和后,引导加载程序可以将其复制到最终位置,从而替换旧的。如果在这部分中发生任何问题,则在进行硬重置后,引导加载程序应看到新固件无效(通过再次运行校验和),然后重试复制。
这是我所知道的最简单,最简单的方法。它在引导加载程序中也只需要很少的代码,并且不需要在主程序和引导加载程序之间复制任何功能(引导加载程序中不需要任何通信逻辑)。
使用引导加载程序和几KB的额外闪存。
引导程序通过UART,USB,I2C或其他协议发送一些特殊命令来执行升级。仅更新主代码-除非通过外部编程器(例如,用于PIC的JTAG / PICkit等),否则永远不会触及引导程序代码。
如果更新失败(电源故障,有人因电线绊倒或其他原因),则小部件将无法工作,但引导加载程序仍将存在,因此可以再次尝试升级。
可以在某处的某个字节中设置标志,以防止主代码未完全更新而导致其执行不正确。
如果您的设备比较昂贵,并且您负担得起成本(并且您的客户关心升级),则可以执行此操作...
(通常,此技术需要外部存储或反复使用jtag。)
有一个固定的程序微型计算机(例如一点PIC),可以使系统停止运行并对其进行重新编程。
因为您不能更改“升级处理器”固件,所以它永远不会出错。
1)用户可以升级设备
2)如果升级失败,他们可以随时重试。它不能被砌
3)即使目标设备不支持引导加载程序(它只是想引导并运行),您仍然可以使其按自己的意愿进行操作。
适用于FPGA,DSP和其他奇数目标。
可以拥有真正整洁的用户界面(甚至PIC都可以运行Web服务器...。)
确保您的产品具有某种简单的串行接口,最好是EIA232。如果没有足够的空间容纳DB-9,则可以使用非标准的连接器。例如,TRS连接器是TxD,RxD和接地所需的全部。
首次对设备进行编程时,请包含bootloader。这应该尽可能简单,因为如果需要新功能,您迟早会希望升级引导加载程序本身。(您甚至可能无法升级)
然后是TRS连接器。使用带有开关的插孔,以便您可以检测到何时有连接器。只需检查一下是否复位即可,如果有插头,则启动引导程序,否则启动应用程序。这样,引导程序和用户应用程序将保持良好分离。(检查实际上是引导程序的一部分;无论应用程序的版本如何,我们都将需要它,否则我们将无法进入引导程序!)
“升级器”将提供哪些设备?PC,U盘,微型SD卡?
一种方法是将应用程序放在可移动的物品(U盘,SD卡等)中。芯片从该项目加载其应用程序。您的升级程序只需交换项目并重新启动。
我所知道的ARM和Cortex微控制器芯片(NXP,Atmel)都具有内置的串行引导加载程序,因此,如果您的更新程序随PC和串行电缆一起提供(并且您已安排好COM端口接口),则只需下载您的更新。