|
芯片用的STM32L051,程序烧入后第一次跑是正常的,后面不管是直接debug复位,还是重上电,都无法重新给变量赋值,直接为0,很奇怪,找了一圈找不到答案,希望能有大佬能解答一下o(╥﹏╥)o
............
信息太少,没法确定原因
信息太少,没法确定原因
大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成static,发现还是会直接清零
大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成stat ...
系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。
仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。
最好贴个代码,不然真不太好分析。
仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。 ...
我在.s文件main前面设置了断点,仿真后发现是初始化的值写不进去,甚至有个变量直接赋值给了0xffff,我在怀疑会不会是写了flash,然后影响了初始化
对于初始化为非零的变量,编译阶段是在程序代码段嵌入该初始值,在启动时把初始值从代码区拷贝到变量的SRAM中,在map的文件中可以看到view和load的两个地址映射关系。一种情况除外,第一次启动完全正确,但是程序对该初始值的代码段修改了,写入了不同信息,那么以后启动,该变量的初始值就变了。
系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。 ...
但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗
你到map的文件中找到该变量对应的exec addr和 load addr,其中load addr应该是0x080xxxxx之类的,然后把第一次编译成功的hex文件调入到cubeprogrammer,找到load addr对应的值,同样的,运行不成功后,用cubeprogrammer也读出该load addr的值,改变了就会赋初值出错,
但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗 ...
从你的描述上,局部变量会发生类似问题,如果是全局变量理论不会的。如果擦写FLASH,会整个区擦除,发生这样的问题也不太可能。还是贴代码吧,看一下MAP文件中,这个变量前面是不是有数组定义,这个数组是不是操作过写入FLASH的情况。或者是你写FLASH的代码不对,导致出这个问题了。
屏蔽了flash相关代码后,发现程序能稳定运行,所以重点查了一下flash,最后发现是地址写错了,导致变量存储的地方被flash重写了,把地址修正之后就解决了