【STM32】需要用串口进行IAP更新,串口发送数据直接写入flash,不进行SRAM缓冲
如何实现边收边写,利用xmodem、ymodem等协议,我需要写一个怎样的IAP来实现接收写入flash,最好有源码例子,谢谢了...
如何实现边收边写,利用xmodem、ymodem等协议,我需要写一个怎样的IAP来实现接收写入flash,最好有源码例子,谢谢了
展开
3个回答
展开全部
你说的这种方式风险很大。原本IAP就是个高风险的过程,代码从SRAM刷入Flash的过程要谨防断电、动作越快完成越好;你可倒好,一边低速接收一边慢慢改写Flash的内容,将这个高风险的刷机时间人为延长了N倍。
更可怕的是你对Flash完全没有认知,还想不缓冲直接写Flash?连扇区缓冲都不用?整个扇区你不问青红皂白先一股脑擦掉、再慢悠悠地一个字节一个字节接收写入?
这个思路,做做论文、搞搞研究还行,真用到产品里面会坑死一家厂的。
更可怕的是你对Flash完全没有认知,还想不缓冲直接写Flash?连扇区缓冲都不用?整个扇区你不问青红皂白先一股脑擦掉、再慢悠悠地一个字节一个字节接收写入?
这个思路,做做论文、搞搞研究还行,真用到产品里面会坑死一家厂的。
追问
写入flash时会建立一个2k的缓存,我目前想实现IAP,但是我的SRAM只有120k,可是HEX却有300K左右,您说我该怎样去做这个IAP,分次接收(通过xmodem等协议)?初学者,请多多指教
追答
分次接收是肯定的,在分次接收的同时,建议你看看所用单片机的Flash扇区大小,按照扇区大小来定块。例如扇区为2kB,那么可以建立两个2kB的SRAM缓冲区,当A收满后,通讯部分继续用B接收,A部分则进行扇区擦除>>扇区写入操作。B收满后,通讯部分用A接收,B部分进行扇区擦除>>扇区写入操作。
另外Flash应当合理规划分配。例如在Flash充足的情况下,要通过可靠性不高的链路进行IAP,一般来说Flash映像应当包含这么几个部分:
① 基础模块(包括驱动部分、IAP部分和通用底层)
② 应用模块A
③ 应用模块B
例如出厂时烧好应用模块A,基础模块的跳转向量指向模块A地址。IAP的时候,程序代码逐个烧入应用模块B,待全部烧写完成、并且校验无误(至少得有分块CRC和全映像CRC)后,IAP将跳转向量修改到应用模块B。下次再升级则烧写应用模块A,两部分循环切换、一用一备。
这样的好处是IAP过程再怎么被打断,大不了也只是IAP失败而已,产品还能按照前一版本程序正常运行,并且底层支持版本回滚,如果新版本程序有问题还能回退到前一版本。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询