硬汉嵌入式论坛

 找回密码
 立即注册
查看: 546|回复: 20
收起左侧

[技术讨论] GD32程序,偶发性if判断不成立但进入判断问题

  [复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-5-16 11:15:06 | 显示全部楼层 |阅读模式
最近程序中出现,有时会出现if判断不成立但进入判断问题,但程序逻辑看不出什么问题;
1、系统是UCOSIII,定义一个浮点型的全局变量A,一个可以设置的参数是无符号16位数据B,在一个任务中判断如图


在定时器中断中也对A进行了计算

但实际运行情况,从记录中A和B的数值中看,有时会出现比如B设置的是2400,A等于135时就进入了判断;

2、有开FPU;

分析原因:可能是判断语句运行时被中断打断导致?不是很懂,请大佬们赐教





回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-16 11:19:29 | 显示全部楼层
定时器中断中的计算:
nCurrent = (float)Get_DC_Current_EachP(Flag.Batterypack)/100;
if(nCurrent <0 ) nCurrent = 0 - nCurrent;
A += nCurrent/3600;
Host_Delivers_Parameters.Discharging_Cap[abs(Flag.Batterypack-1)] = (u16)(A*10);

判断语句:
if(A*10 > B)
{
record(A*10, B);
return;
}
回复

使用道具 举报

0

主题

32

回帖

32

积分

新手上路

积分
32
发表于 2025-5-17 03:04:05 | 显示全部楼层
你把A赋值给C,用C*10去和B比较,然后记录的也使用C的值
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
发表于 2025-5-17 08:55:59 | 显示全部楼层
如果认为是中断打断问题,可以在任务里面访问这个变量做个临界保护
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-5-19 14:03:48 | 显示全部楼层
定义这个全局变量的时候有用volatile修饰吗,不然可能会被编译器优化
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-21 15:41:18 | 显示全部楼层
eric2013 发表于 2025-5-17 08:55
如果认为是中断打断问题,可以在任务里面访问这个变量做个临界保护

是,后面增加了,但是这个理由说服不了自己,32位单片机对浮点型的操作应该是原子的,那也不应该会受影响,最多是上一次修改的旧数据,不至于偏差过大才对
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-21 15:43:17 | 显示全部楼层
Leo20201027 发表于 2025-5-17 03:04
你把A赋值给C,用C*10去和B比较,然后记录的也使用C的值

是,后面也这么操作了,但是不知道还会不会出,想讨论下这种情况可能导致的因素
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-21 15:46:30 | 显示全部楼层
石头君 发表于 2025-5-19 14:03
定义这个全局变量的时候有用volatile修饰吗,不然可能会被编译器优化

后面增加了,但是我优化设置的是level 0,理论上来说应该是不会被优化的,而且是偶发的现象
回复

使用道具 举报

85

主题

783

回帖

1038

积分

至尊会员

积分
1038
发表于 2025-5-21 22:58:50 | 显示全部楼层
XXZ_XHH 发表于 2025-5-21 15:46
后面增加了,但是我优化设置的是level 0,理论上来说应该是不会被优化的,而且是偶发的现象

level 0不代表不优化,不要被level 0欺骗了
回复

使用道具 举报

1

主题

77

回帖

80

积分

初级会员

积分
80
发表于 2025-5-22 08:28:02 | 显示全部楼层
堆栈溢出,加大堆栈即可
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-23 11:43:00 | 显示全部楼层
neomissing 发表于 2025-5-22 08:28
堆栈溢出,加大堆栈即可

跑的是UCOSIII,查过任务栈空间,还有很大的富余
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-23 11:48:17 | 显示全部楼层
庄永 发表于 2025-5-21 22:58
level 0不代表不优化,不要被level 0欺骗了

请教下,如果编译器优化应该是一个固定的bug,每次执行都会,而不是偶发的吧
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-5-23 14:15:15 | 显示全部楼层
庄永 发表于 2025-5-21 22:58
level 0不代表不优化,不要被level 0欺骗了

但如果是被编译器优化,应该是一个一直出现的bug,不是偶发性的吧
回复

使用道具 举报

1

主题

77

回帖

80

积分

初级会员

积分
80
发表于 2025-5-23 23:15:11 | 显示全部楼层
XXZ_XHH 发表于 2025-5-23 11:43
跑的是UCOSIII,查过任务栈空间,还有很大的富余

就是这个问题
回复

使用道具 举报

97

主题

537

回帖

843

积分

金牌会员

积分
843
发表于 2025-5-24 08:27:25 | 显示全部楼层
你加个打印,把A和B的值打印出来看看。
我肯定,不可能出现条件没满足但是if进去的现象。

我怀疑是变量在你不知道的地方被修改了,然后你这里显示成了这种情况。

另外就是仿真看到的有时候不一定是真实的。你打印试一下。
共产主义一定胜利!
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2025-5-24 19:01:41 | 显示全部楼层
我也遇到了同样的问题,临界保护是可以的.原因不知
回复

使用道具 举报

85

主题

783

回帖

1038

积分

至尊会员

积分
1038
发表于 7 天前 | 显示全部楼层
XXZ_XHH 发表于 2025-5-23 14:15
但如果是被编译器优化,应该是一个一直出现的bug,不是偶发性的吧

不一定是一直出现,编译器优化等级设置为0,代表编译器不做影响用户调试的优化,但是会做一些基本的优化,特定情况会出现一些异常,这是编译器的BUG
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 6 天前 | 显示全部楼层
会飞的猪_2020 发表于 2025-5-24 08:27
你加个打印,把A和B的值打印出来看看。
我肯定,不可能出现条件没满足但是if进去的现象。

我也觉得不可能出现if不成立进入的问题,但是打印出来的数值就是判断不成立,这两个值并不是通过仿真看到的
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 6 天前 | 显示全部楼层

不太理解,任务内局部变量和临时变量应该是存放在任务栈内,但是任务栈空间查过是够的
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 6 天前 | 显示全部楼层
jxcrg_t35 发表于 2025-5-24 19:01
我也遇到了同样的问题,临界保护是可以的.原因不知

没有深究一下吗
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 4 天前 | 显示全部楼层
会不会是有符号数与无符号数之间比较造成的隐式转换问题?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-1 17:53 , Processed in 0.368250 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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