这次主要对STM32F103/Keil和LPC2478/IAR加了一个IAP在线升级功能,
主要记录一下自己的思路,无代码,实在是代码感觉没啥写的,都是一些网上很多流传的东西。
1、开发环境
Keil+stm32f103+JLINK
2、程序思路
在升级中,必须要考虑的问题就是:升级成功以及失败,然后失败的补救措施。所以我以前的写法是最简单粗暴的
2.1、IAP升级旧版本
bootloader有两个功能,由标志位控制,
一个是跳转到app程序(一般升级后进入)
一个是允许升级程序(一般升级失败或者初始状态)
bootloader根据标志位判断当前是升级还是跳转,如果程序处于app则先更新标记位表示进入升级,然后复位,进入bootloader
这个优点就是代码简单,空间利用率高,如果程序很大的话比较适合,但是如果空间使用不大那么可以使用双缓存,毕竟可以在出错之后回滚。
2.2、IAP服务器托管网升级双缓存版本
我使用的单片机内部flash大小为512kb,所以我按照128kb可以划分为5个区域
- bootloader大小为64kb,假设地址为0x80000000-0x80010000
- 运行区域大小为128kb,主要此地址固定代码中断向量表偏移量,假设地址为0x80010000-0x80030000
- 升级数据存储1大小为128kb,假设地址为0x80030000-0x80050000
- 升级数据存储2大小为128kb,假设地址为0x80050000-0x80070000
- flash数据存储大小为64kb,假设地址为0x80070000-0x80080000
bootloader有两个功能,由标志位控制,
一个是跳转到app程序
一个是允许升级程序(一般升级失败或者初始状态)
(1)、其中app程序中,例如当前数据存储1已经存在了运行成功的数据,说明此时运行区域和数据存储1的数据相同,那么这就相当于一个备份,此后升级数据将使用存储2地址。反之亦然。
(2)、然后bootloader的跳转前会判断是否是升级过的,如果升级过,那么将会比如升级数据存储1,那么需要将存储1的数据拷贝到运行区域,然后再跳转,就是将0x80030000-0x80050000的数据复制到0x80010000-0x80030000。反之存储2亦然
(3)、如果不需要复制数据的话就直接跳转,跳转前会将指定标志位设置为错误,跳转到app之后,由app端将标志服务器托管网位设置为正常。这样如果跳转失败,重启后就不会跳转,如果是初始情况将不做任何处理,如果是升级出现的异常,将会从备份数据复制到运行区域然后重新跳转运行。例如此前升级完成,但是此时新数据存储在数据存储1位置,老数据存储在数据存储2位置,复制存储1的数据到运行区域,结果启动失败,那么再次启动后将老数据复制到运行区域,重新运行
注意:已经复制过的就不用复制,只复制升级后的那次
2.3、IAP升级双缓存版本的优化
此前尽管这个是有备份,但是其实是属于空间浪费了,为什么需要如果,是因为代码写死了中断向量表便宜0x10000,所以运行区域必须从0x80010000开始,但是如果代码将中断向量表偏移改为动态的,那么则可以节省出一份空间。其中bootloader只是不需要复制内存到运行区域,其他步骤都一样
- bootloader大小为64kb,假设地址为0x80000000-0x80010000
- 运行区域1大小为192kb,假设地址为0x80010000-0x80040000
- 运行区域2大小为192kb,假设地址为0x80040000-0x80070000
- flash数据存储大小为64kb,假设地址为0x80070000-0x80080000
此时,运行区域1的中断向量偏移应该设置为0x80010000,运行区域2的中断向量偏移应该设置为0x80040000。
具体操作如下:
因为跳转前,是由bootloader决定跳转到那个区域的,所以我们只需要将app的开头改为读取当前启动是什么区域,然后根据区域直接更改中断向量偏移的地址即可。
if(flag == block2){
SCB->VTOR = FLASH_BASE | 0x40000;
}else{
SCB->VTOR = FLASH_BASE | 0x10000;
}
注意:2.3未验证,但是逻辑上是不会错的
注意:我的bootloader所有行为都是由上位机控制,上位机发送跳转/准备升级/接收数据/升级完成/复位等一系列命令
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: Kubernetes(k8s) 资源限制:resources,LimitRange,ResourceQuota
目录 一.系统环境 二.前言 三.Kubernetes资源限制简介 四.创建没有资源限制的pod 4.1 创建没有资源限制的pod 4.2 内存消耗测试 五.使用resources字段配置资源限制 5.1 限制最低内存 5.2 限制最低CPU 5.3 限制最低…