1. 研究背景
现今,许多基于arm-linux平台开发的应用程序开发都具备了物理的网卡这样的外围设备,这也是为通过网络升级应用程序提供了诸多便利,网络的便捷,快速,稳定等诸多特点。今天,我们约定应用程序的自动升级与升级失败自动回滚所采用的升级方式是通过网络,当然,其他诸如usb,串口,sd卡等也可以类比实现。
2. 用到的工具
- fw_printenv (这个在u-boot的tools/env)下能生成
生成fw_printenv需要用的命令为
make env
同时还要拷贝fw_env.config到你的文件系统的/etc/fw_env.config中去
,具体可以百度
3. 实现的基本原理
- 1.在u-boot中添加一个环境变量,命名为BOOTAPP_RETRYTIMES,具体在板载头文件中定义,比如,我移植TQ2416的开发板,而且在进入到引导内核之前,记得将该环境变量的值进行+1操作。
那就在$(ROOTDIR)/include/configs/TQ2416.h下定义
#define BOOTAPP_RETRYTIMES 1
- 2.在bootloader引导了内核启动后,进入到应用程序中时,读取该环境变量的值,判断该值如果超过3次,那么就运行上一版本的稳定程序,否则,清楚该变量的值为0,即:
unsigned char bootretrytime = getenv("BOOTAPP_RETRYTIMES");
if(bootretrytime > 4){
system("上一个版本的app");
}else{
system("刚才升级的app");
system("fw_setenv BOOTAPP_RETRYTIMES 0");
}
4.总结
其实,这样的理念可以用在许多不同场合的,适配不同处理器的程序自动升级以及升级失败回滚的方式上,利用bootloader引导程序中增加变量值,与应用程序中清除值,这种思维方式,可以实现诸多单片机程序的自动升级以及回滚等