关于用UART串口在线升级,摸了几天,看到一个参考文献如下,
整体程序分为主程序部分和Bootloader部分。主程序部分是正常的应用程序,Bootloader专用于代码更新,包括Flash API的完整实现和代码从Flash重定向至RAM的算法,同时还包括一个通信规约,用于从上位机接收更新用的二进制代码。上位机可以是PC、MCU或者PLC等。程序更新流程如下:
① 刚上电时Bootloader检测主程序,并向上位机发送握手信号,等待回复。
② 如果Bootloader在一段时间内没有收到握手确认信号且主程序校验完整则进入主程序;如果Bootloader收到握手确认信号,或者主程序校验未通过则进入程序更新状态。拷贝Flash API和相关通信程序、规约等进入RAM,然后Bootloader程序准备接收更新数据。主程序运行时也可能随时收到上位机的程序更新指令,此时主程序给Bootloader发指令进入更新状态。
③ 上位机发指令清除Flash的相关扇区,并等待Bootloader发送删除完成信号。
④ 收到确认帧后上位机发送一帧数据,然后等待确认。
⑤ Bootloader将收到的数据在校验合格后写入Flash,然后发送确认帧。
⑥ 上位机在收到确认帧后回到第6步,直到数据全部发送完毕。
⑦ 更新完成,Bootloader重新定位程序,DSP控制权交给主程序。
有几个问题如下:
1.我对该流程理解,不知是否正确: EntryPoint→ code_start → wd_disable → bootloader→c_int00 →main().
2.bootloader程序用C语言写怎么跳转到c_int00 执行?
3.升级前的main()放在FLASHA,升级后的main()放在FLASHB,c_int00 通过怎样选择入口地址(入口地址时知道的,c_int00 怎么知道是FLASHA还是FLASHB里面的main()? |