上次已经弄清楚f2板子的flash操作,将HAL库的一些函数取出,改成以地址为输入参数的擦除与写入函数。
现在需要理清 flash里的两个app 和SD卡里待升级的app之间的 升级关系 与 跳转关系。
升级关系:
flash当中储存了两个app,和两个app的状态,每个app有三个状态:status,use,version。
status状态表示了app是否是新更新的,每个app在更新时,新写入的永远标志都为newer,而flash当中没有被擦除掉剩余的(flash当中有两个app,每次只擦除刷写其中一个)则在更新后被置为older(无论之前status是什么,都被置为older)
use状态表示了这个app是不是可用的(也就是可以顺利启动跑起了的),每个app在写入的时候这个状态都是cant_use,BootLoader会先跳转至newer状态的app并运行,如果能够成功运行一段时间(待确定),则在用户程序中将这个newer状态的app的use状态改写为can_use。
version 是此版本的版本号,作为此次开发的板子,由于没有任何外界触发条件(即没有按钮与屏幕的输入),所以板子每次上电都是自动检测是否更新app,以version版本号作为是否更新的条件。
升级过程:(合并词--SDversion == SDapp的version)
上电——检测flash中两个app的version和SD卡中app的version,若SDversion > flashversion,证明此SDapp没有被更新过,进入更新状态———比较flashapp的use位,优先更新cant_use状态的app,若没有cant_use则比较status,升级olderapp——更改status状态——将app[2]状态写入flash
跳转关系:
BootLoader引导后跳转至newer状态的app——能够运行,写flash更改newerapp的use状态为can_use。
若不能使用,暂时未解决,下面是不能使用的思想:
BootLoader引导后跳转至newer状态的app——多次不能运行,在引导程序中写flash更改status为older,则BootLoader再次引导时若没有newer,则跳转至can_use状态的app。
用户升级设备时,若进入升级状态则以跑马灯表示进入,亮蓝灯表示正在升级,升级成功则亮5s绿灯,在以跑马灯结尾表示升级结束进入用户程序。
若失败,则亮红灯不变。