你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

编译后第一次烧入程序,变量值正常,复位后再跑,变量值直接清零,这是为什么呢?

[复制链接]
城外云 提问时间:2022-7-25 19:53 / 已解决

收藏 评论13 发布时间:2022-7-25 19:53

举报

13个回答
城外云 回答时间:2022-7-25 19:55:32
芯片用的STM32L051,程序烧入后第一次跑是正常的,后面不管是直接debug复位,还是重上电,都无法重新给变量赋值,直接为0,很奇怪,找了一圈找不到答案,希望能有大佬能解答一下o(╥﹏╥)o
一个脑子不够用 回答时间:2022-7-26 07:50:46
............
yklstudent 回答时间:2022-7-26 08:33:48
信息太少,没法确定原因
城外云 回答时间:2022-7-26 10:34:25
yklstudent 发表于 2022-7-26 08:33
信息太少,没法确定原因

大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成static,发现还是会直接清零
废鱼 回答时间:2022-7-26 11:35:39
城外云 发表于 2022-7-26 10:34
大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成stat ...

系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。
HardwareMonkey1 回答时间:2022-7-26 13:44:49
仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。
HardwareMonkey1 回答时间:2022-7-26 13:46:45
最好贴个代码,不然真不太好分析。
城外云 回答时间:2022-7-26 14:11:22
HardwareMonkey1 发表于 2022-7-26 13:44
仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。
...

我在.s文件main前面设置了断点,仿真后发现是初始化的值写不进去,甚至有个变量直接赋值给了0xffff,我在怀疑会不会是写了flash,然后影响了初始化
yr 回答时间:2022-7-26 14:26:57
对于初始化为非零的变量,编译阶段是在程序代码段嵌入该初始值,在启动时把初始值从代码区拷贝到变量的SRAM中,在map的文件中可以看到view和load的两个地址映射关系。一种情况除外,第一次启动完全正确,但是程序对该初始值的代码段修改了,写入了不同信息,那么以后启动,该变量的初始值就变了。
城外云 回答时间:2022-7-26 14:36:48
废鱼 发表于 2022-7-26 11:35
系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。
...

但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗
yr 回答时间:2022-7-26 14:50:45
你到map的文件中找到该变量对应的exec addr和 load addr,其中load addr应该是0x080xxxxx之类的,然后把第一次编译成功的hex文件调入到cubeprogrammer,找到load addr对应的值,同样的,运行不成功后,用cubeprogrammer也读出该load addr的值,改变了就会赋初值出错,
废鱼 回答时间:2022-7-26 16:08:51
城外云 发表于 2022-7-26 14:36
但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗
...

从你的描述上,局部变量会发生类似问题,如果是全局变量理论不会的。如果擦写FLASH,会整个区擦除,发生这样的问题也不太可能。还是贴代码吧,看一下MAP文件中,这个变量前面是不是有数组定义,这个数组是不是操作过写入FLASH的情况。或者是你写FLASH的代码不对,导致出这个问题了。
城外云 回答时间:2022-7-26 16:21:57
屏蔽了flash相关代码后,发现程序能稳定运行,所以重点查了一下flash,最后发现是地址写错了,导致变量存储的地方被flash重写了,把地址修正之后就解决了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版