远程升级中, boatload跳转到app,为什么app内存使用多少,会导致跳转过去能否正常执行,否则会反复重启,难道你们编译器有问题?就是说正常能跳转过去,但是app再增加一点静态内存使用量,就跳不过去,反复死机复位,但是app多出的内存用动态内存就没问题,动态内存可以不用释放也没事,奇怪,汇编跟踪也没看出啥/
详细描述:
跳过去后立即就复位了,没有来得及打印LOG,
内存超出不太可能,连使用一半还不到啊,BOOTLOAD和APP加起来的内存是可能超过了64K,单APP也就20K,肯定不会,静态分配只是一个数组几百个字节的,怎么会错。
看样子你的bootloader也是使用了RT-Thread哈?那就不奇怪了,试想问一下是否也同样是在CortexM处理器上跑的?那就更加不奇怪了,你想哈,你在跳转前,bootloader的CPU模式是什么?handle、thread?
如果是thread模式下你能正常修改msp吗?如果没法修改msp,那你的跳转是否就存在问题了?栈飞了吧!!!
加上static也不行,现在我初步怀疑是不是BOOTLOAD跳转前没有把中断关闭干净,导致跳到APP时前期处理的时间长点(静态内存需要初始化处理,越大时间越久)后,触发了原来的中断,指针复位?下面是我的跳转的几个方案(都不行):
1, // 检查栈顶地址是否合法.
if ((((__IO uint32_t )app_addr) & 0x2ffe0000) != 0x20000000)
{
LOG_I(“Illegal Stack code.”);
fota_res = RT_FOTA_GENERAL_ERR;
goto __exit_start_application;
}
2, typedef void (app_func_t)(void);
uint32_t app_addr = appxaddr;
uint32_t stk_addr = ((IO uint32_t )app_addr);
app_func_t app_func = (app_func_t)(((IO uint32_t *)(app_addr + 4)));
方案2的关中断后面加上
试试
奇诡的是我只加了个延时 rt_thread_mdelay(200);就可以跳过去了,加的位置:
上面还有个事很奇诡,为什么加上
__disable_irq();
就跳不过去,理论上应该加啊加一句,跳转方案2去掉__disable_irq()也可以跳过去
rt_thread_mdelay(200);
这个延时是为了防止存在挂起的串口中断如果不加延时,关了中断,又没有清中断,就会存在串口中断挂起,跳到app后时钟初始化时开中断死掉。
为什么加上__disable_irq();就跳不过去,理论上不应该啊,我看人家都是加上的
会不会还有其它线程打印,延时加长些呢?
这个延时绝了,竟然解决了我无限重启的问题,但是我并没有删除_disable_irq()@JYFP_3506