STM32 RW段某个内存位置的值随机变化

dwiller 2013-09-10 04:42:16
在单独的一个工程上可以正常工作,但是通过IAP更新到STM32,RW段某个内存的值随机变化。
假设这个内存是0x20000044,(我的RW段是0x20000000到0x20000818)我的栈顶是0x200010D0,调试观察了一下,在函数调用的时候这个值就会变化,但是我跳转到这个函数,单步执行,又不会变化!
求高手解答,谢谢
...全文
336 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lr2131 2013-09-13
  • 打赏
  • 举报
回复
引用 9 楼 dwiller 的回复:
[quote=引用 1 楼 wangfan027 的回复:] 优化? 或者观察窗口显示错误?
我现在又出现了单步不会有异常,一旦一个函数全速过去,就会出现取值异常,请问版主这是什么情况??[/quote] 单步调试不出问题,全速跑出问题,这类问题我也遇到过,但是对这类问题的总结做得不好,现在想不起来了。现在怀疑会不会是延时的问题,看看是不是哪个地方的延时时间太短了,加长点是不是要更好点。
lr2131 2013-09-13
  • 打赏
  • 举报
回复
引用 9 楼 dwiller 的回复:
[quote=引用 1 楼 wangfan027 的回复:] 优化? 或者观察窗口显示错误?
我现在又出现了单步不会有异常,一旦一个函数全速过去,就会出现取值异常,请问版主这是什么情况??[/quote] 看了自己回答的内容,发现有错,更正: 1.RW段是保存定义时初始化了的静态变量。 2.定义时未初始化的静态变量在ZI段中。 3.在把ZI段从加载域弄到运行域时,才把运行域ZI段中全部的数据写成0,所以静态变量在定义时如果没有初始化,那默认的一般都是本类型的0值就是这个原因。
seedundersnow 2013-09-13
  • 打赏
  • 举报
回复
是栈区吧? 你要确定RAM分配再看它的值才有意义
lr2131 2013-09-12
  • 打赏
  • 举报
回复
引用 5 楼 dwiller 的回复:
[quote=引用 4 楼 lr2131 的回复:] [quote=引用 3 楼 dwiller 的回复:] [quote=引用 2 楼 lr2131 的回复:] RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的....
非常感谢,说的很有条理!STM32的中断向量是放在0x08000000开头的,当我使用IAP的时....[/quote] 你说下用的STM32 CPU的具体型号,我想查一下相关的资料。遇到这样的问题,我也很感兴趣,看能不能帮上忙。 [/quote]我用的芯片是...[/quote] 呵呵,还是被版主给说中了。我也没往编译器优化这方面去怀疑,我一般总是先怀疑自己的代码逻辑是不是对的,到最后基本确认没问题了才会往别的方向去调。 再确认一下如果真是编译器优化方面的问题,小结一下,贴出来分享一下你的成果呗。
dwiller 2013-09-12
  • 打赏
  • 举报
回复
引用 4 楼 lr2131 的回复:
[quote=引用 3 楼 dwiller 的回复:] [quote=引用 2 楼 lr2131 的回复:] RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的....
非常感谢,说的很有条理!STM32的中断向量是放在0x08000000开头的,当我使用IAP的时....[/quote] 你说下用的STM32 CPU的具体型号,我想查一下相关的资料。遇到这样的问题,我也很感兴趣,看能不能帮上忙。 [/quote]我用的芯片是STM32F100C8T6,编译器是MDK4.7,我改了一下优化密度,居然又可以实现了,居然跟这个会有关系,唉,浪费了我整整1天半时间
dceacho 2013-09-12
  • 打赏
  • 举报
回复
引用 9 楼 dwiller 的回复:
[quote=引用 1 楼 wangfan027 的回复:] 优化? 或者观察窗口显示错误?
我现在又出现了单步不会有异常,一旦一个函数全速过去,就会出现取值异常,请问版主这是什么情况??[/quote] 我也不知道了 只预见过多次单步死机,全速不死机的情况,是换了个IDE然后单步找到问题所在的. 如果你在跑什么操作系统的话检查下有没有什么地方溢出
dwiller 2013-09-12
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
优化? 或者观察窗口显示错误?
我现在又出现了单步不会有异常,一旦一个函数全速过去,就会出现取值异常,请问版主这是什么情况??
dwiller 2013-09-12
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
优化? 或者观察窗口显示错误?
还会窗口错误显示??
dwiller 2013-09-12
  • 打赏
  • 举报
回复
引用 6 楼 lr2131 的回复:
[quote=引用 5 楼 dwiller 的回复:] [quote=引用 4 楼 lr2131 的回复:] [quote=引用 3 楼 dwiller 的回复:] [quote=引用 2 楼 lr2131 的回复:] RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的....
非常感谢,说的很有条理!STM32的中断向量是放在0x08000000开头的,当我使用IAP的时....[/quote] 你说下用的STM32 CPU的具体型号,我想查一下相关的资料。遇到这样的问题,我也很感兴趣,看能不能帮上忙。 [/quote]我用的芯片是...[/quote] 呵呵,还是被版主给说中了。我也没往编译器优化这方面去怀疑,我一般总是先怀疑自己的代码逻辑是不是对的,到最后基本确认没问题了才会往别的方向去调。 再确认一下如果真是编译器优化方面的问题,小结一下,贴出来分享一下你的成果呗。 [/quote] 其实我也搞不清楚是哪的问题,昨天下班回去的时候程序都是好好地,今天早上回来,又出现取值错误了,把以前的程序Git回来也不管用。还是单步不会出问题,全速运行就会跳入取值错误,程序跑飞到0x442101C0去了,相当郁闷啊!!
dwiller 2013-09-11
  • 打赏
  • 举报
回复
引用 2 楼 lr2131 的回复:
RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的。 按你描述的,在函数调用的时候,也就是正常运行的时候,这个0x20000044内存值有变化。但是在单步调试的时候,不变。我个人觉得可能是你当前这个跟踪的函数以外,有什么地方改变了它。在全速运行时,花不了多长时间就会发现值变了,但是单步调其实是很慢的,很难复现这个情况。 这样,你先查查0x20000044这个是被编译器分配来做什么用的,是不是中断向量表的一部分,还是说是什么静态变量的存储地址。接着再往下查,是静态变量的话,它是什么变量,在代码中查查被哪些地方读写过,有没有可能是被“多线程”方式改变了。 另外也比较怀疑是做IAP时有点问题,IAP过程如果用到中断向量表(这几乎是一定要用到的),一定要注意中断向量表重映射的问题,你说的0x20000044和0x20000000很近,0x20000000可能就是你这个STM32 CPU的RAM,重映射中断向量表的时候,一般要重映射到RAM中,不知道是不是IAP相关的代码影响到了这个内存值的变化,注意查查这个问题。
非常感谢,说的很有条理!STM32的中断向量是放在0x08000000开头的,当我使用IAP的时候,中断向量只是复制到0x08004000(用户程序的起始地址),这个跟LPC的有点区别,我没有放到RAM中。我查了,0x20000044存放的一个全局变量的值,这个全局变量不会改变,只是我会读取它的值。我的0x20000034到0x20000050也存了其它的全局变量,都没有发生改变,就是那个内存的值会变。感觉应该不是我代码改变了这个值,因为这个工程独立运行的时候,都正常。但是我通过IAP烧写进去运行就出现这种情况;所以我推测是IAP的问题,但是我用我的IAP更新别人的HEX文件,运行正常,所以我就查不到错误在那了??
lr2131 2013-09-11
  • 打赏
  • 举报
回复
引用 3 楼 dwiller 的回复:
[quote=引用 2 楼 lr2131 的回复:] RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的....
非常感谢,说的很有条理!STM32的中断向量是放在0x08000000开头的,当我使用IAP的时....[/quote] 你说下用的STM32 CPU的具体型号,我想查一下相关的资料。遇到这样的问题,我也很感兴趣,看能不能帮上忙。
lr2131 2013-09-10
  • 打赏
  • 举报
回复
RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的。 按你描述的,在函数调用的时候,也就是正常运行的时候,这个0x20000044内存值有变化。但是在单步调试的时候,不变。我个人觉得可能是你当前这个跟踪的函数以外,有什么地方改变了它。在全速运行时,花不了多长时间就会发现值变了,但是单步调其实是很慢的,很难复现这个情况。 这样,你先查查0x20000044这个是被编译器分配来做什么用的,是不是中断向量表的一部分,还是说是什么静态变量的存储地址。接着再往下查,是静态变量的话,它是什么变量,在代码中查查被哪些地方读写过,有没有可能是被“多线程”方式改变了。 另外也比较怀疑是做IAP时有点问题,IAP过程如果用到中断向量表(这几乎是一定要用到的),一定要注意中断向量表重映射的问题,你说的0x20000044和0x20000000很近,0x20000000可能就是你这个STM32 CPU的RAM,重映射中断向量表的时候,一般要重映射到RAM中,不知道是不是IAP相关的代码影响到了这个内存值的变化,注意查查这个问题。
dceacho 2013-09-10
  • 打赏
  • 举报
回复
优化? 或者观察窗口显示错误?

27,515

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧