久芯网

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

avatar 城外云 提问时间: 2023-07-22 13:38:00 / 已解决

13个回答
  • avatar 城外云
    回答时间: 2023-07-22 14:01:59

    芯片用的STM32L051,程序烧入后第一次跑是正常的,后面不管是直接debug复位,还是重上电,都无法重新给变量赋值,直接为0,很奇怪,找了一圈找不到答案,希望能有大佬能解答一下o(╥﹏╥)o

  • avatar 一个脑子不够用
    回答时间: 2023-07-22 14:25:58

    ............

  • avatar yklstudent
    回答时间: 2023-07-22 14:49:35

    信息太少,没法确定原因

  • avatar 城外云
    回答时间: 2023-07-22 15:13:12
    yklstudent 发表于 2022-7-26 08:33
    信息太少,没法确定原因

    大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成static,发现还是会直接清零

  • avatar 废鱼
    回答时间: 2023-07-22 15:30:14
    城外云 发表于 2022-7-26 10:34
    大佬您好,就是原本的变量赋值后,然后再初始化跑进main函数后,变量就清零了,我尝试过把变量定义成stat ...

    系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。

  • avatar HardwareMonkey1
    回答时间: 2023-07-22 16:02:39

    仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。

  • avatar HardwareMonkey1
    回答时间: 2023-07-22 16:33:58

    最好贴个代码,不然真不太好分析。

  • avatar 城外云
    回答时间: 2023-07-22 17:05:28
    HardwareMonkey1 发表于 2022-7-26 13:44
    仿真器仿真一下,勾掉直接跳main,从startupXXX.s开始,单步调试,查看该变量值的变化。 ...

    我在.s文件main前面设置了断点,仿真后发现是初始化的值写不进去,甚至有个变量直接赋值给了0xffff,我在怀疑会不会是写了flash,然后影响了初始化

  • avatar yr
    回答时间: 2023-07-22 17:35:08

    对于初始化为非零的变量,编译阶段是在程序代码段嵌入该初始值,在启动时把初始值从代码区拷贝到变量的SRAM中,在map的文件中可以看到view和load的两个地址映射关系。一种情况除外,第一次启动完全正确,但是程序对该初始值的代码段修改了,写入了不同信息,那么以后启动,该变量的初始值就变了。

  • avatar 城外云
    回答时间: 2023-07-22 18:01:08
    废鱼 发表于 2022-7-26 11:35
    系统不会自动清除数据,一般是代码操作清楚,比如赋值、清除数组时溢出导致后面的数据被清除。 ...

    但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗

  • avatar yr
    回答时间: 2023-07-22 18:22:22

    你到map的文件中找到该变量对应的exec addr和 load addr,其中load addr应该是0x080xxxxx之类的,然后把第一次编译成功的hex文件调入到cubeprogrammer,找到load addr对应的值,同样的,运行不成功后,用cubeprogrammer也读出该load addr的值,改变了就会赋初值出错,

  • avatar 废鱼
    回答时间: 2023-07-22 18:47:49
    城外云 发表于 2022-7-26 14:36
    但是我在初始化后,变量并没有赋初值,也是可能地址溢出重复写的问题吗 ...

    从你的描述上,局部变量会发生类似问题,如果是全局变量理论不会的。如果擦写FLASH,会整个区擦除,发生这样的问题也不太可能。还是贴代码吧,看一下MAP文件中,这个变量前面是不是有数组定义,这个数组是不是操作过写入FLASH的情况。或者是你写FLASH的代码不对,导致出这个问题了。

  • avatar 城外云
    回答时间: 2023-07-22 19:09:47

    屏蔽了flash相关代码后,发现程序能稳定运行,所以重点查了一下flash,最后发现是地址写错了,导致变量存储的地方被flash重写了,把地址修正之后就解决了

会员中心 微信客服
客服
回到顶部