打印
[STM32F1]

跳转到APP时这个变量会释放吗?

[复制链接]
1040|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiaxw|  楼主 | 2021-2-6 12:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从之前的STM32F0,F1都使用了IAP。
首先我使用的是根据判断STM32内部FLASH的方法来判断是否需要IAP升级。如在0x8004000处写入0xAABB,则需要更新。更新完写入0xBBAA,这样IAP程序来判断是否需要执行更新。
一直有个疑问,APP程序更新完后,跳转到APP。如果发送的的是正确的APP升级文件,那肯定没问题,这是如果发送错了APP升级文件(这不是我的意愿),就会出现问题,无法执行APP程序而进入到void HardFault_Handler(void)这个硬件中断函数。这时你就完全无能为力了,无法重现更新APP程序,这个情况不是我们想要的。
现在的处理方式是在IAP程序的void HardFault_Handler(void)函数中,写入IAP使能标记(即在0x8004000写入0xAABB)然后重启NVIC_SystemReset();这样可实现即时你更新选错了APP文件,也可以重新更新。
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
    STMFLASH_Write(IAP_FLAG_ADD,&IAP_Flag_ENABLE_Data,1);
    NVIC_SystemReset();
  while (1)
  {
  }
}
疑问1:这样的方式是否可行,会不会影响到APP的void HardFault_Handler(void)函数。
疑问2:
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.  

我在IAP程序中定义了一个120K的变量,跳转到APP时这个变量会释放吗?

使用特权

评论回复
沙发
xxrs| | 2021-2-6 12:58 | 只看该作者
这样指标不治本

使用特权

评论回复
板凳
tian111| | 2021-2-6 13:01 | 只看该作者
如果错误的APP程序能在该单片机上跑,就不会进入HardFault_Handler

使用特权

评论回复
地板
pengf| | 2021-2-6 13:04 | 只看该作者
比如针对该硬件的测试程序等等,这时还是无法完成升级

使用特权

评论回复
5
supernan| | 2021-2-6 13:06 | 只看该作者
如果有人机交互的机制,可以通过上电判断特殊情况强制进入升级模式来解决比较合理

使用特权

评论回复
6
liuzaiy| | 2021-2-6 13:08 | 只看该作者
为什么会升错,加强管理啊

使用特权

评论回复
7
morrisk| | 2021-2-6 13:10 | 只看该作者
这样的方式不可靠也不好拓展,IAP建议boot只作拷贝的跳转,boot可以做的很小,可留给大空间给app;

使用特权

评论回复
8
morrisk| | 2021-2-6 13:20 | 只看该作者
app区分A、B区,A放app,正常跳转至A;B区存升级app

使用特权

评论回复
9
morrisk| | 2021-2-6 13:23 | 只看该作者
升级时先将固件存放在B区,复位后boot拷贝B区app到A区

使用特权

评论回复
10
zhuhuis| | 2021-2-6 13:26 | 只看该作者
通过校验手段,可以避免固件错误、中途断电等问题;如果固件大,还可以将B区备份区放在外置flash中(如spi flash)

使用特权

评论回复
11
chuxh| | 2021-2-6 13:28 | 只看该作者
自行尝试,没这样做过,未知。

使用特权

评论回复
12
stly| | 2021-2-6 13:30 | 只看该作者
会释放,跳出main已经释放。

使用特权

评论回复
13
renyaq| | 2021-2-6 13:45 | 只看该作者

你的逻辑是错的。

使用特权

评论回复
14
houcs| | 2021-2-6 13:47 | 只看该作者

你应该判断是否接收到更新指令。而不是某个地方写了什么,你这种做法是一锤子买卖

使用特权

评论回复
15
morrisk| | 2021-2-6 13:49 | 只看该作者
还有个补救icp

使用特权

评论回复
16
kangzj| | 2021-2-6 13:53 | 只看该作者
isp都可以,直接更新你的bootloader部分

使用特权

评论回复
17
jiaxw|  楼主 | 2021-2-6 13:56 | 只看该作者
不是定义在main的函数中,是在全局变量中的也一样吗

使用特权

评论回复
18
jiaxw|  楼主 | 2021-2-6 13:58 | 只看该作者
描述的不仔细,在接收到更新指令后,在FLASH中写入需更新状态,然后重启,IAP来判断

使用特权

评论回复
19
xxrs| | 2021-2-6 14:01 | 只看该作者
IAP能否得以执行一般不该依赖于APP程序本身的安全性、可靠性,难道APP程序异常了IAP升级都没得进行了?

使用特权

评论回复
20
wangzsa| | 2021-2-6 14:03 | 只看该作者
如果从IAP到APP跳转成功了,一般来讲向量表就改动了,后面的HARD FAULT一般发生在app区了

使用特权

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

本版积分规则

825

主题

9762

帖子

4

粉丝