固件更新如何设计?

yinxun   2008-1-18 09:29 楼主
  本人在项目中设计的系统需要在线更新,是一个基于DSP的系统,就是可以通过上位机经过网口更新配置里面的算法程序及参数,但是不知道具体的框架设计.因为要更新肯定要涉及到FLASH的烧写,但又不是全部擦除和烧写,只更新需要更新的,那这个如何控制呢,又如何重新BOOT.这一块之前没有接触到,若有达人有这方面经验,望指导.

回复评论 (5)

     一般NAND flash是整块擦写的,那就只有把你要擦除和烧写的东西放在一个或几个固定的块上,然后只擦写这些位置就可以了,但这样没有办法实现负载平衡。如果你想实现更高级的功能,还是用移植一个文件系统在上面吧。
     如果你的参数比较少的话,还是用EEPROM吧。
     呵呵,没有具体玩过嵌入式,只说说自己的想法,请不要见笑。
点赞  2008-1-18 13:03
更新后要重启吧,不然新的配置及数据无法起作用。软重启其实很简单,不是重点。

有操作系统吗?
有SDRAM吗?
如果没有,那么程序就是在片内的FLASH上跑,更新的时候就要注意刷新数据的位置。

将FLASH分成相应的区域,烧录的时候,把需要更新的数据全部放到一个固定的地址。
在程序里操作该地址的数据。更新的时候,也只更新该地址起的区域。
点赞  2008-1-19 10:01
to shuiyan

没有操作系统,在dsp里做的,有个类似操作系统的东西,dsp/bios,有SDRAM.

2楼的主要说了数据的更新,假如是程序更新呢?比如我要改变里面的程序,但是程序也正在跑着的.
点赞  2008-1-21 15:06
基本的启动程序,不可以动。因为如果在更新的时候掉电,就和中了CIH病毒一个下场了。除非在硬件上设计一个备份的启动,不过这样做就很不划算。
程序架构应该至少分为三块,一块是程序的基本框架,包含了必须的功能(类似于BIOS+操作系统,或者更确切的说,是bootrom,这部分基本不会动)。一块是可变参数的程序和数据存储区(类似于windows下的用户程序)。当然,你也可以把程序和数据块分开,这个要看你的具体应用而定,一般分开要更好些。更新的时候,只更新这部分程序和参数。同时,考虑到更新失败的特殊情况,还需要用一块区域来做备份。当系统尝试启动应用程序出现异常的时候,自动跳转到备份程序运行。如果系统更新后运行成功,则自动更新备份区域。
系统在运行的时候,程序一般跑在SRAM或者SDRAM里面,因为对DSP来讲,Flash太慢了,尤其写的时候很麻烦。因此,一般来说,除了有些特殊应用不允许重启动之外,其它情况下都不需要考虑动态修改正在运行的程序,因为可以通过更新Flash后重启动完成更新任务。如果确实有不能重启的需求,而SDRAM又够大,那么你可以直接开辟一块内存,把你要更新的程序整块写到内存里,然后,再跳转到这块内存开始执行(可以用C语言里的函数指针来实现)。当然,有的变态应用,是连这样的跳转都不允许的(太慢,又或者内存不够大),那么只有动态修改程序内容了。这要求DSP有很好的任务调度机制,你可以用一个高优先级的任务,从网络接收数据,然后逐块刷新相应位置的内存区域。这对软件编写者的要求较高,一方面要对运行中的内存分布了如指掌,一方面要了解各程序模块之间的数据同步机制。稍不注意,系统就要跑飞或者是结果错误。
点赞  2008-1-22 00:08
ningxin 说的非常清楚,佩服一个。

从简单到复杂,对程序开发的要求也是越来越高。

主要还是看lz的项目需求:是否允许重启?如果允许,那就直接更新flash,如果不允许,就要更新SDRAM内存了。
点赞  2008-1-22 11:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复