找回密码
 立即注册
查看: 183|回复: 4

c251开启寄存器变量优化后,电机的pid控制异常

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-24 10:45:46

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2026-5-16 12:08:12 | 显示全部楼层 |阅读模式
大家c251开启寄存器优化后,会不会出现各种诡异的bug

这是pid变量

这是pid变量

开启3级优化后

开启3级优化后

这是开启了优化的电机速度

这是开启了优化的电机速度

这是关了寄存器优化的电机

这是关了寄存器优化的电机
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:738
  • 最近打卡:2026-07-04 20:08:40
已绑定手机
已实名认证

138

主题

3676

回帖

9445

积分

版主

积分
9445
发表于 2026-5-16 15:55:14 | 显示全部楼层
1.优先使用全局变量,局部变量可能会被编译器错误优化掉
2.全局变量下,使用volatile修饰,可以让编译器不优化这个变量,防止出现问题
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 2026-5-16 18:11:41 | 显示全部楼层
编译器优化
简化部分操作
得到更快的执行速度
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-24 10:45:46

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2026-5-24 10:45:46 | 显示全部楼层
王*** 发表于 2026-5-16 15:55
1.优先使用全局变量,局部变量可能会被编译器错误优化掉
2.全局变量下,使用volatile修饰,可以让编译器不 ...

局部变量如何避免被优化,开启优化后,整个mcu启动会出问题,摄像头和外设都没法正常工作,需要重复5-10次复位单片机,才能开始工作

点评

只有全局变量+volatile可以避免被优化掉 局部变量下,如果对应变量没有被显式调用,或者只有写入没有读取操作(尽管读取可能在其他函数内),则优化等级同样会优化掉带有volatile的局部变量 同时,更容易出现问题  详情 回复 发表于 2026-5-24 17:22
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:738
  • 最近打卡:2026-07-04 20:08:40
已绑定手机
已实名认证

138

主题

3676

回帖

9445

积分

版主

积分
9445
发表于 2026-5-24 17:22:53 | 显示全部楼层
-_*** 发表于 2026-5-24 10:45
局部变量如何避免被优化,开启优化后,整个mcu启动会出问题,摄像头和外设都没法正常工作,需要重复5-10 ...

只有全局变量+volatile可以避免被优化掉


局部变量下,如果对应变量没有被显式调用,或者只有写入没有读取操作(尽管读取可能在其他函数内),则较高优化等级同样会优化掉带有volatile的局部变量
同时,更容易出现问题的是将函数指针作为参数进行调用,尽管这在C语言中是允许的,但是多次调用时,编译器可能会生成错误的调用树
此问题在keil的帮助文档中有所介绍,解决方案就是尽可能的少使用函数指针方式作为参数传递,可以使用全局变量进行传递
截图202605241721239720.jpg
想要避免被局部变量被优化掉,只能降低优化等级,或者关闭REMOVEUNUSED(死代码消除功能,才能方式被编译器错误优化掉代码)
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 14:06 , Processed in 0.075797 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表