打印

串口在线升级问题

[复制链接]
1381|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjx880303|  楼主 | 2014-3-18 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于用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()?

相关帖子

沙发
shenmu2012| | 2014-3-18 17:33 | 只看该作者
参考下的额,很不错的介绍

使用特权

评论回复
板凳
Steaven| | 2014-5-6 09:53 | 只看该作者
1.我对该流程理解,不知是否正确: EntryPoint→ code_start → wd_disable → bootloader→c_int00 →main().      

  【评论:】基本正确   

2.bootloader程序用C语言写怎么跳转到c_int00 执行?
  【评论:】C在线调用汇编执行跳转

3.升级前的main()放在FLASHA,升级后的main()放在FLASHB,c_int00 通过怎样选择入口地址(入口地址时知道的,c_int00 怎么知道是FLASHA还是FLASHB里面的main()?
  【评论:】除非你人为调整不同版本程序的cmd文件结构对flash重新分配,否则你是不用关心到底main在哪里;你需要关注的是整个应用程序的入口地址。bootloader在检测到不用更新程序时,同一跳转到这个入口地址(entry point),那么后来怎么跳到main里面的是由编译器处理的一气呵成的事情,不用你去考虑。提示:MCU在上电后怎么调到main执行程序的?弄懂了这点,也就不难理解从自己的bootloader调到main的过程了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝