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

在keil中仿真程序时,结构体变量出现错乱

[复制链接]
patch1582 提问时间:2026-8-28 21:34 / 未解决

在keil中仿真程序时,结构体变量出现错乱,如下图

image.pngimage.png

kp一直是402,ki一直是4,这两个变量其实是个常量 但是在仿真时缺出现错误的情况,像是错位了,或者读取ram是指针错位。

收藏 评论3 发布时间:2026-8-28 21:34

举报

3个回答
fafa1 回答时间:2026-8-29 09:46:30

是不是 对齐的缘故啊?或者前边的某个数据结构 数据溢出,污染了 kp?

patch1582 回答时间:2026-8-29 20:54:07

fafa1 发表于 2026-8-29 09:46
是不是 对齐的缘故啊?或者前边的某个数据结构  数据溢出,污染了  kp?
...

不像是呢,有时程序刚开始跑起来,数据就错乱。有时跑十几分钟才第一次出现

butterflyspring 回答时间:2026-8-31 10:26:08
可能性有很多种,可以根据实际情况排查:


内存越界写(最常见,踩内存)

  • 数组越界:局部 / 全局数组写超范围,刚好覆盖到这个结构体所在内存。
  • 指针错误:野指针、指针偏移错误、强制类型转换错误,向结构体地址附近写数据。

  • memcpy/memset长度传错,拷贝长度大于目标缓冲区,覆盖相邻内存。
栈溢出(局部结构体)
结构体是局部变量(函数栈上):

  • 结构体很大,栈空间不够;
  • 函数嵌套深、中断栈过小,栈向下 / 向上生长,栈溢出覆盖其它栈变量。
特征:结构体是函数内局部变量,函数运行时乱,退出函数更乱;全局结构体一般不会栈溢出。
多访问冲突:主循环+ 中断同时读写同一个结构体(并发竞争)
结构体全局 / 静态变量,主函数在读 / 写,中断服务函数也读写,没有保护。

  • 结构体大于 1 字节,一次读写不是原子操作;中断打断半写状态,数据被撕坏。
典型:主循环拷贝结构体,中断里更新这个结构体,出来一半旧一半新。
调试器假象(并不是真的内存变了)

  • 优化等级太高 -O1 / -O2,变量被编译器优化到寄存器,不在 RAMKeil 窗口显示的是无效旧值。
  • 结构体没有加 volatile,编译器优化,调试窗口刷新假象;实际 RAM 值并没有变。
  • 断点打在流水线中间,寄存器和内存不同步,窗口显示错乱。
硬件 / 外设 DMA 直接踩内存
DMA 目标地址写错,DMA持续往结构体所在内存写数据。非常隐蔽,运行时随机篡改。
现象:结构体随机乱,和外设收发时间强相关。
指针指向错误内存

  • 结构体指针指向栈已经销毁的局部变量(函数退出,栈内存回收,被别的代码覆盖)
  • 错误强制转换,把别的内存地址强转为结构体指针。
中断栈过小(Cortex‑M
中断栈栈空间不足,中断运行栈溢出,破坏主栈内存。


关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版