用IAP技术进行单片机的自动升级,官方有源码,一般根据需求修改。 比如,因为我们的产品遍布各处,不可能让施工人员一个个去按按键触发升级,所以串口命令触发升级的方式明显更符合实际。以及Ymodem兼容性不好的原因,我们也换成了自己的协议。 做了大半个月,出现了一个怪象。 IAP下载升级包,100%时跳转APP,APP显示软件版本号,这是正常流程。 但是我们还有个异常和强度测试,在升级的各个阶段不停地拔电复位,看最终是否能升级成功。 同事反应,有时下载100%了,APP没显示版本号,而是又去从0%重新升级了,不停循环,但是重新上电后就一次性升级跳转成功了。一天测试数百次只会出现一次,是小概率事件。复现时,我留意了现象,是APP没正常运行,看门狗重启,又去IAP判断标志位,继续升级了。 下载完跳转前要__disable_irq(); APP开头就要NVIC_SetVectorTable keil设置好IROM起始地址..... 这些老生常谈自然不用多说。 乍一看很容易以为是APP有问题,或者IAP中断残留,没处理好跑飞了。但是请注意,异常出现后,只要拔电复位,一样的APP,能够升级成功,这说明APP是没问题的; 如果中断没处理好,那不会升级700次才出现1次bug; 所以才能称之为“怪象”。 除了中断残留,还有堆栈溢出、内存泄漏....各种情况怀疑了一遍,网上没人有类似的情况。 后来用自动化脚本,每10秒升级一次单片机,把bug复现了3次,每次bug的出现都是不断电连续升级600~800次,把问题定位在了SystemInit();函数,APP就是在这没有继续往下走了。 看到有网友说卡在SetSysClockTo72();里的do while循环出不来。留意了下,想起我的单片机用的是内部8M晶振,没有外接晶振,但是SYSCLK_FREQ_72MHz宏是打开的。按理说这个宏打开了并不会有很大影响,因为系统检测到外部晶振不存在时,仍然会使用内部8M晶振。 抱着试一试的态度,注释了这个宏,升级了一晚上,3000+次,早上发现bug没出现,升级仍正常。 继续测试,用自动化脚本同时测试多台单片机。 不出意外的话,可以得出结论:晶振是多少M最好就用相应的宏,不然即使看起来工作正常,但不代表没隐患。 |
关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )
GMT+8, 2025-8-4 18:50 , Processed in 0.125000 second(s), 28 queries , Gzip On.
地址:深圳市南山区科技生态园2栋A座805 电话:19926409050