硬汉嵌入式论坛

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

关于全局结构体值出现异常的问题

[复制链接]

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2025-6-10 17:28:46 | 显示全部楼层 |阅读模式
为了降低产品功耗,所以降低了主频,因此修改了IAP程序和app程序,修改完后发现有一个按键失效了!?一开始以为是配置出问题了,修改了很久的配置,后面发现是按键初始化的结构体在运行到app程序的时候被改变了!如下图

图1

图1
图1为定义的全局结构体,定义时将全部成员初始化了,

图2

图2
图2为进入调试但还未运行程序时,各成员的值,可以看到是和初始化的值一致的
当程序运行至app时,

图3

图3
如图3,结构体的值发生改变

图4

图4
如图4所示,不太了解stm32的存储机制,全局变量应该是从flash复制一份到SRAM中赋值?因为我看结构体的地址是在0x200000C,SRAM起始地址为0x20000000,猜测是不是因为IAP程序中的全局变量使用了这个地址,并且对该地址中的内容重新赋过值,导致运行到APP的时候,结构体指针指向该地址,导致成员值变化成该地址中的内容。
如果是我猜测的这样,有两个疑问:1.全局变量是在什么时候被分配地址的?是在编译的时候还是程序运行的时候?2.如何能在跳转至app时,将SRAM中的数据清空,以免发生这种情况?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-11 08:04:02 | 显示全部楼层
如果你的程序里面BOOT到地址0x200000C,APP里面也用到的话,除非你的APP没有做初始化,否则BOOT影响不到APP。

1、分配地址是编译的时候就确定了。
2、RAM的数据清除和赋值不需要用户管,全是用户自己的程序决定的,然后对于MDK,是__main函数处理的。
回复

使用道具 举报

2

主题

71

回帖

77

积分

初级会员

积分
77
发表于 2025-6-11 08:41:37 | 显示全部楼层
1、分配地址是编译期确定,对于RAM地址是允许2个程序重叠的
2、 在app使用的结构体需要在app中定义和赋初值

如果需要bl向app传递信息,也有麻烦一些的办法实现部分RAM不被初始化,比如MDK中的链接脚本  使用UNINIT修饰
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-6-11 17:32:03 | 显示全部楼层
eric2013 发表于 2025-6-11 08:04
如果你的程序里面BOOT到地址0x200000C,APP里面也用到的话,除非你的APP没有做初始化,否则BOOT影响不到APP ...

昨天大致排查出问题了,但是因为不太懂汇编语句还不太确定,可能是编译器优化等级的问题,我选择的是-O2优化等级,在APP中单步调试,发现在跳转至APP前,0x20000000-0x20000010中的值一直在变化(猜测是IAP程序中某些全局变量在改变,因为查看了map文件,通过查看map文件也知道了全局变量是在编译时候完成地址分配的了),当跳转至APP程序时,APP程序并未将该区域数据清空,导致值错误。
随后我将优化等级切换至-O0,再次单步调试,发现在执行至APP前,有语句将0x20000000后的区域清空,随后赋值为我初始化的值(即图1),猜测在.S启动文件中应该是有清除SRAM的语句的,但是高优化等级省去了这一步(?)
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-6-13 10:03:58 | 显示全部楼层
踩姑娘的小蘑菇 发表于 2025-6-11 08:41
1、分配地址是编译期确定,对于RAM地址是允许2个程序重叠的
2、 在app使用的结构体需要在app中定义和赋初 ...

昨天大致排查出问题了,但是因为不太懂汇编语句还不太确定,可能是编译器优化等级的问题,我选择的是-O2优化等级,在APP中单步调试,发现在跳转至APP前,0x20000000-0x20000010中的值一直在变化(猜测是IAP程序中某些全局变量在改变,因为查看了map文件,通过查看map文件也知道了全局变量是在编译时候完成地址分配的了),当跳转至APP程序时,APP程序并未将该区域数据清空,导致值错误。
随后我将优化等级切换至-O0,再次单步调试,发现在执行至APP前,有语句将0x20000000后的区域清空,随后赋值为我初始化的值(即图1),猜测在.S启动文件中应该是有清除SRAM的语句的,但是高优化等级省去了这一步(?)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 21:37 , Processed in 0.043435 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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