硬汉嵌入式论坛

 找回密码
 立即注册
查看: 468|回复: 12
收起左侧

[技术讨论] 关于在IRAM中定义变量复位重启的问题

[复制链接]

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2025-9-28 15:11:44 | 显示全部楼层 |阅读模式
硬汉哥,我看了您在一劳永逸解决Bootloder和APP的互相跳转,遇到了这个问题,希望得到您和大家的回复。
我的变量是这样定义的:uint32_t g_JumpInit __attribute__ ((at(0x2001c000)))=20;
然后我的option的情况如图中所示。
现在遇到的情况是:我在主函数中对g_JumpInit 进行++操作,比如说我加了5次,debug的情况g_JumpInit =25.然后我复位,没有掉电,这个时候,g_JumpInit 还是等于20。我的问题是这个时候他不应该等于25了吗?
请问是哪里处理问题,该怎么解决。我用的是GD32F470ZGT6
33.png
22.png
44.png
55.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-9-28 16:50:17 | 显示全部楼层
AC5的话,仅这样设置即可


123.png
回复

使用道具 举报

25

主题

244

回帖

319

积分

高级会员

积分
319
QQ
发表于 2025-9-29 18:11:53 | 显示全部楼层
原理是 startup_stm32xxxx.s 里会清理 ram 区,如果你有初值,那么从 rom 中载入初值。大致是这样的过程。

你给出的图44是一个 mdk 的链接器脚本,可以在此基础上加一个段,使用 UNINIT 标志告诉链接器,这部分软重启时不必初始化,

[C] 纯文本查看 复制代码
LR_IROM1 0x08000000 0x00100000      
{
....其他
	BL_UINT32 0x20000000 UNINIT 0x00000004   ; bootload共享的指示烧录区,作为内存,掉电重置,非掉电软启动不重置
	{  
	  *(.bss.BLFlag)    
	}
....其他
}


然后将 g_JumpInit  变量放到对应位置。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-9-30 09:37:08 | 显示全部楼层
本帖最后由 marker 于 2025-9-30 14:10 编辑

如果数据量不多的话,可考虑bkp寄存器
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2025-9-30 14:06:15 | 显示全部楼层
eric2013 发表于 2025-9-28 16:50
AC5的话,仅这样设置即可

硬汉哥,按照你这样定义的话,如何保证初始的值是20呢
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2025-9-30 14:06:40 | 显示全部楼层
yono 发表于 2025-9-29 18:11
原理是 startup_stm32xxxx.s 里会清理 ram 区,如果你有初值,那么从 rom 中载入初值。大致是这样的过程。
...

好的,我试试看
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-9-30 15:07:39 | 显示全部楼层
永远是小学生 发表于 2025-9-30 14:06
硬汉哥,按照你这样定义的话,如何保证初始的值是20呢

帖子里面有例子,是在BOOT的程序里面设置的初始化值

实战技能分享,一劳永逸的解决BOOT跳转APP失败问题,含MDK AC5,AC6和IAR,同时制作了一个视频操作说明
https://forum.anfulai.cn/forum.p ... 9595&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 7 天前 | 显示全部楼层
各位工程师,大家好。经历了国庆,然后有出差了个多月,现在终于是回来。我按照
LR_IROM1 0x08000000 0x00100000     
{
....其他
    BL_UINT32 0x20000000 UNINIT 0x00000004   ; bootload共享的指示烧录区,作为内存,掉电重置,非掉电软启动不重置
    {
      *(.bss.BLFlag)   
    }
....其他
}
这样样的写法试了,是不行的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 7 天前 | 显示全部楼层
永远是小学生 发表于 2025-11-14 13:44
各位工程师,大家好。经历了国庆,然后有出差了个多月,现在终于是回来。我按照
LR_IROM1 0x08000000 0x00 ...

你这个MDK工程是AC5还AC6,两个的实现有所不同。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 7 天前 | 显示全部楼层
eric2013 发表于 2025-11-14 14:49
你这个MDK工程是AC5还AC6,两个的实现有所不同。

我用的是AC5,现在的难点是刚上电的时候它的初始值为20,在while大循环中,使用串口指令让它++。比如加了5次,这个时候它的值是25,然后不掉电,使用NVIC_SystemReset()函数,系统重启后,debug看还是20,但是希望它是25.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 6 天前 | 显示全部楼层
永远是小学生 发表于 2025-11-14 14:55
我用的是AC5,现在的难点是刚上电的时候它的初始值为20,在while大循环中,使用串口指令让它++。比如加了5 ...

如果是AC5,不需要设置分散加载,使用MDK默认的分散加载配置,然后家里这个就行
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init));
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 前天 16:13 | 显示全部楼层
eric2013 发表于 2025-11-15 09:24
如果是AC5,不需要设置分散加载,使用MDK默认的分散加载配置,然后家里这个就行
uint32_t g_JumpInit __ ...

硬汉哥,你这样设置的话,它的值不是随机的吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 前天 17:34 | 显示全部楼层
永远是小学生 发表于 2025-11-19 16:13
硬汉哥,你这样设置的话,它的值不是随机的吗

你那边实在不行的话,直接记录数值到内部Flash末尾空间或者外置EEPROM, SPI Flash等空间里面吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 23:06 , Processed in 0.049742 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表