打印
[信息]

【实战经验】从 IAP Loader 向 App 跳转不可靠

[复制链接]
2108|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 14:03 编辑

从 IAP Loader 向 App 跳转不可靠

问题:
该问题由某客户提出,发生在 STM32F103TBU6 器件上。据其工程师讲述:在其产品设计中,软件的架构采用 IAP Loader+App 的模式。IAP Loader 部分负责管理和更新 App 部分,而 App 部分则负责常规的业务的处理,两部分代码分别由独立的软件工程生成。系统运行时先启动 IAP Loader,由其判断是否需要更新 App,如不需更新则跳转到 App,由 App 进行常规业务处理。在软件调试过程中,其软件工程师发现从 IAP Loader 到 App 的跳转存在某种不可靠性。该跳转在某些时候可以完成预设的功能,即启动 App 运行,而另外的一些情况下则会导致程序跑飞。而该跳转的结果又与一些看似不相关的事物相关联,比如,在中断向量表的末端加入一个多余的向量,或将某个全局变量变更一下定义的位置都会应响到该跳转的结果是成功还是跑飞。该工程师对此颇为不解。由于其在异地,只能通过电话沟通,但从话语中可以感受到浓重的疑惑与震惊,不亚与当年麦哲伦发现地球是圆的而带来的惊叹:怎么会这样?!

调研:
从其软件中提取出负责跳转的代码,如表(一)
将该函数做两处修改:
    1. 在行(1)的前端加关键字 register
    2. 交换行(2)与行(3)的位置
修改后,代码如表(二):
用将修改后的代码替换原工程中的对应的代码,重新测试。发现,修改后的程序每次都能做出正确的跳转,不再受其它代码行的增减、变更的影响。

结论:
堆栈的变更导致局部变量失效,引用已失效的变量进一步造成严重的错误,属于典型的软件逻辑漏洞。

处理:
修改软件代码,如表(二)。

建议:
有时,问题的复杂程度,有时跟你看问题的角度有关。记得早年参加过一个电器维修学习班,跟着一个老师傅学修家电(找工作也不容易)。老师傅手艺精湛,各种电器不管带有什么疑难杂症,摆弄一阵就修好了,当时佩服不得了。等老师傅手上没活了,少不了向他请教一翻。于是,我说出了一个疑问:电器各式各样,花样翻新,要把每一种电器的原理都研究透,得花多少时间?你是怎么做到的呢?老师傅告诉我:我根本就不懂什么原理,我只会拆解和安装,拆解之后把每一部分跟正常的去比对,发现有差异就换掉,于是就修好了。原来如此!

对应的PDF:从 IAP Loader 向 App 跳转不可靠
更多实战经验请看:【ST MCU实战经验汇总贴】


评分
参与人数 1威望 +3 收起 理由
styleno1 + 3 很给力!
沙发
幻梦kfc| | 2015-8-11 10:12 | 只看该作者
学习了

使用特权

评论回复
来自iPhone 5c
板凳
yklstudent| | 2015-8-11 11:37 | 只看该作者
mark,版主阅历丰富啊

使用特权

评论回复
地板
mmuuss586| | 2015-8-11 12:38 | 只看该作者

支持下;

使用特权

评论回复
5
styleno1| | 2015-8-11 14:58 | 只看该作者
值得一阅。
PS:楼主的图让我感觉到在催眠

使用特权

评论回复
6
amanda_s| | 2015-8-13 16:00 | 只看该作者
文笔很幽默生动!原来写技术贴也可以这样!学习了!:D

使用特权

评论回复
7
SLHSu37| | 2015-8-13 16:12 | 只看该作者
这部分还是参考官方历程,COPY过来就行,不用改·

使用特权

评论回复
8
cookles| | 2015-8-13 17:17 | 只看该作者
楼主可否讲解详细一些,小白的我还是不明白。

使用特权

评论回复
9
putron09| | 2015-8-14 17:54 | 只看该作者
先记着,以后备用

使用特权

评论回复
10
shuidi_wangdan| | 2020-3-25 18:43 | 只看该作者
本帖最后由 shuidi_wangdan 于 2020-3-25 18:44 编辑

我遇到下面这种情况了,我用的是STM32F2的芯片,大多数是第二次上电才能正常启动,还请指点为什么?
代码如下:
void iap_load_app(u32 appxaddr)
{
      vu32 appxaddr_reg;
    if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {  
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }        
}        
代码一开始就是图二中2行和3行那样,但是还是又跑飞的情况,我把这段函数屏蔽掉大多数情况能正常启动,偶尔会跑飞,请楼主给指点。

使用特权

评论回复
11
香水城|  楼主 | 2020-4-7 15:26 | 只看该作者
shuidi_wangdan 发表于 2020-3-25 18:43
我遇到下面这种情况了,我用的是STM32F2的芯片,大多数是第二次上电才能正常启动,还请指点为什么?
代码如 ...

在做跳转之前,建议你将刚才开启过的外设都复位掉,使能过的中断也禁用掉,保证跳转过程中不会发生中断。

使用特权

评论回复
12
mcuisp| | 2020-4-7 20:55 | 只看该作者
干这个活还是用汇编靠谱

使用特权

评论回复
13
ayb_ice| | 2020-4-8 08:30 | 只看该作者
跳转前要关闭总中断(BOOT使用的中断也建议一并关掉),否则APP还在初始时可能产生不可控的中断,另外APP与BOOT里同时使用的外设需要特别注意,APP运行时这些外设可能已经不处于复位后的状态了

使用特权

评论回复
14
香水城|  楼主 | 2020-4-8 09:52 | 只看该作者
ayb_ice 发表于 2020-4-8 08:30
跳转前要关闭总中断(BOOT使用的中断也建议一并关掉),否则APP还在初始时可能产生不可控的中断,另外APP与 ...

不建议只是简单地关总中断,会有隐患,跳转前要将IAP阶段开启过的中断使能位都清除掉,以防跳转过程中产生中断请求。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17106

帖子

287

粉丝