搜索
bottom↓
回复: 32

一个多条件判断对STM8有难度吗?

[复制链接]

出0入4汤圆

发表于 2020-4-18 08:12:09 | 显示全部楼层 |阅读模式
在玩STM8,发现时不时会很卡,前几天发现一条语句就会导致系统不正常,如下:
if((A_flag==1)&&(B_flag==1))
使用这个判断语句后,系统有一个AD转换全局变量值(volatile)不正常
改成if(A_flag&&B_flag)后,故障消除。
是IAR 的原因吗?还是我这写法有问题?
注:已消除同一函数中同时存在的乘除运算

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2020-4-18 08:45:37 | 显示全部楼层
会不会你这俩标志会出现非0和非1的其他值

出0入10汤圆

发表于 2020-4-18 09:02:01 | 显示全部楼层
99.9999%是我们的程序或其他地方设置有误,这类低级错误不是我等菜鸟能碰到的。

出0入0汤圆

发表于 2020-4-18 09:10:02 | 显示全部楼层
楼主你可以把你的两个变量打印出来,看是否如下面所说。

————————————————————————————————

&:按照位与操作,例如:0010&1101,结果为0000

      &是java中的位逻辑运算:
      eg: 2&3=2;

      分析如下: 2的二进制为10 ;3的二进制为11 ; 逻辑&之后为10

&&:短路与,表示如果两个条件都成立则执行之后的逻辑;

        例如:if(a==0&&b==0),意思就是if a为0并且b为0的时候,进行下一步操作。


出0入8汤圆

发表于 2020-4-18 09:27:45 来自手机 | 显示全部楼层
不要怀疑,肯定是程序问题

出0入4汤圆

 楼主| 发表于 2020-4-18 09:28:08 | 显示全部楼层
wuha 发表于 2020-4-18 08:45
会不会你这俩标志会出现非0和非1的其他值

我这个判断语句执行内容只是改变一个状态,不会导致系统一直停留,就是每次都执行都没问题

出0入8汤圆

发表于 2020-4-18 09:29:17 来自手机 | 显示全部楼层
STM8好歹也是16M时钟,逻辑运算时间长到人能感觉出来?

出0入4汤圆

 楼主| 发表于 2020-4-18 09:29:49 | 显示全部楼层
一心2013 发表于 2020-4-18 09:10
楼主你可以把你的两个变量打印出来,看是否如下面所说。

——————————————————————— ...

我用的是逻辑与&&,不是按位与

出0入90汤圆

发表于 2020-4-18 09:30:51 | 显示全部楼层
楼主的描述里面有个坑。他说的“卡”到底是什么意思,没人知道。
单片机做计算、做逻辑判断比人强多了,你都不会卡,单片机怎么可能会卡?
卡只是一个表面现象。
楼主把if((A==1) && (B==1))觉得卡,改成if(A && B)就觉得不卡。说明了一个情况,就是A,B的取值,并不是0或者1,肯定还有>1的时候。

出0入4汤圆

 楼主| 发表于 2020-4-18 09:34:21 | 显示全部楼层
honami520 发表于 2020-4-18 09:30
楼主的描述里面有个坑。他说的“卡”到底是什么意思,没人知道。
单片机做计算、做逻辑判断比人强多了,你 ...

我这个判断语句执行内容只是改变一个状态,不会导致系统一直停留,就是每次都执行都没问题,但无故导致ADC测量的一个变量值变0了。我说的卡是之前总莫明的出现,比如加一行、减一行就会出现

出0入0汤圆

发表于 2020-4-18 09:45:06 | 显示全部楼层
本帖最后由 wuha 于 2020-4-18 09:47 编辑
ZL_electric 发表于 2020-4-18 09:34
我这个判断语句执行内容只是改变一个状态,不会导致系统一直停留,就是每次都执行都没问题,但无故导致AD ...


楼主的意思,是不是你的程序本来正常运行的,但代码里增加一句或者减少一句无关紧要的,甚至类似nop指令的代码,整个程序运行会有不正常的地方?这个我已经也遇到过,就是STM8。我是方波驱动蜂鸣器,本来声音正常,随便哪里加个代码,或者少个代码就不正常,再多一句就又正常了,到现在也不知道原因是什么。

PS,我用的也是IAR,现在已经不用STM8系列了。

出0入442汤圆

发表于 2020-4-18 10:05:43 | 显示全部楼层
wuha 发表于 2020-4-18 09:45
楼主的意思,是不是你的程序本来正常运行的,但代码里增加一句或者减少一句无关紧要的,甚至类似nop指令 ...

这是8位机,程序访问16位/32位数据如果是中断访问的数据,一是必须加volatile,二是必须要二次读取确认,否则肯定不太正常。

stm8是6502架构,先天不足(指令残缺),编译器也是非标的。avr貌似在大于16kb之后也会出现各种奇怪的现象。keil c51更是专用c编译器,不过尚可,但是某些代码编译出来仍然存在bug,编译器bug很正常了。目前gcc4.8之后基本可以认为是可信赖的(仅x86,x64,arm,riscv)。像mips哪怕用gcc8.2仍然存在一个巨大的switch case被编译丢一个case。代码运行死活不正常,我对着汇编一个一个查才查出来。

出0入93汤圆

发表于 2020-4-18 10:22:03 | 显示全部楼层
wye11083 发表于 2020-4-18 10:05
这是8位机,程序访问16位/32位数据如果是中断访问的数据,一是必须加volatile,二是必须要二次读取确认, ...

程序员的责任最大,但编译器也是有锅的。就是说,IAR for STM8就是垃圾,cosmic比它强得多得多,虽然cosmic也有一些bug,但一般应用似乎并不容易触发。
至于IDE,stvd就是垃圾中的有害垃圾了,使得好多人转用没那么垃圾的IAR for STM8了

出0入0汤圆

发表于 2020-4-18 10:45:38 来自手机 | 显示全部楼层
到汇编里比较下,看有什么不同。

出0入8汤圆

发表于 2020-4-18 11:32:43 | 显示全部楼层
A_flag的定义是 bit  还是 byte  如果是byte  这2种写法 完全就是2种意思。

出0入442汤圆

发表于 2020-4-18 11:33:56 来自手机 | 显示全部楼层
takashiki 发表于 2020-4-18 10:22
程序员的责任最大,但编译器也是有锅的。就是说,IAR for STM8就是垃圾,cosmic比它强得多得多,虽然cosmi ...

其实bug主要是c编译器优化流程和模块时产生的不确定性(比如开lto之后某些函数功能异常)。

出0入0汤圆

发表于 2020-4-18 11:44:36 | 显示全部楼层
我stm8使用比较多,应该说ST的系列都使用的比较多,stm32也使用的比较多,遇到这种问题。。。都是经验不够导致的,或者裸机程序架构不到位。。。我以前刚开始搞MCU的时候,也遇到过这种问题。现在怎么搞都不会遇到了,及时遇到了,也能及时找到问题所在。

出0入0汤圆

发表于 2020-4-18 11:45:26 | 显示全部楼层
这种,一般都是程序架构本身有问题,就是说恰好处于临界状态。。。

出0入4汤圆

 楼主| 发表于 2020-4-18 11:59:07 | 显示全部楼层
OneRain 发表于 2020-4-18 11:45
这种,一般都是程序架构本身有问题,就是说恰好处于临界状态。。。

我就是通过大神写的BUG处理办法给解决了之前的故障,仿佛的确和16、32位数有关系

出0入4汤圆

 楼主| 发表于 2020-4-18 11:59:56 | 显示全部楼层
wye11083 发表于 2020-4-18 10:05
这是8位机,程序访问16位/32位数据如果是中断访问的数据,一是必须加volatile,二是必须要二次读取确认, ...

你说的这个很有参考意义

出0入4汤圆

 楼主| 发表于 2020-4-18 12:17:45 | 显示全部楼层
887799 发表于 2020-4-18 10:45
到汇编里比较下,看有什么不同。

惭愧,我还没发现在IAR中哪可以看汇编

出0入0汤圆

发表于 2020-4-18 12:43:28 | 显示全部楼层
ZL_electric 发表于 2020-4-18 12:17
惭愧,我还没发现在IAR中哪可以看汇编

你的怀疑最好是看下汇编,我用的IAR for ARM仅供参考,选项在Compiler-List-Output assembler file

出0入76汤圆

发表于 2020-4-19 13:03:02 | 显示全部楼层
这种情况99.99999%是你自己程序问题, 你A_flag 与 B_flag,非0,但不一定是1, 还是去认真检查你的 A_flag 与 B_flag 写操作吧
if((A_flag != 0)&&(B_flag != 0))   <==> if( A_flag && B_flag)

出0入0汤圆

发表于 2020-4-19 13:08:01 来自手机 | 显示全部楼层
这是两条完全不同意义的程序

出0入0汤圆

发表于 2020-4-19 14:21:36 | 显示全部楼层
检查下你的code 吧

出0入0汤圆

发表于 2020-4-19 15:12:10 | 显示全部楼层
widesoft2 发表于 2020-4-18 09:02
99.9999%是我们的程序或其他地方设置有误,这类低级错误不是我等菜鸟能碰到的。 ...

100%   ...................................................

出0入475汤圆

发表于 2020-4-19 21:13:27 来自手机 | 显示全部楼层
haistart 发表于 2020-4-19 13:08
这是两条完全不同意义的程序

按我这个没学过c语言的班门弄斧来看的话的确是这样。楼主的两个写法一个是说A和B都为1,一个是说A和B都不为零。
就是不晓得楼主到底是要判断只要都不为零就满足呢还是都必须为1才满足:)

出0入0汤圆

发表于 2020-4-19 23:25:49 来自手机 | 显示全部楼层
每每如此,都是程序的问题

出0入0汤圆

发表于 2020-4-20 08:41:13 | 显示全部楼层
楼主,if((A_flag==1)&&(B_flag==1))这个条件是必须A_flag和B_flag都等于1时才成立吧,而if(A_flag&&B_flag)这个条件是A_flag和B_flag都不为0就成立吧,这两个还是有差异的,当A_flag和B_flag存在大于1的值时if((A_flag==1)&&(B_flag==1))不成立,但是if(A_flag&&B_flag)还是成立的,这样两个条件肯定会有时间差异啊

出0入4汤圆

 楼主| 发表于 2020-4-20 09:08:18 | 显示全部楼层
1a2b3c 发表于 2020-4-19 21:13
按我这个没学过c语言的班门弄斧来看的话的确是这样。楼主的两个写法一个是说A和B都为1,一个是说A和B都不 ...

这两个变量做标志用,只有0、1两个状态,运行结果是对的

出0入4汤圆

 楼主| 发表于 2020-4-20 09:10:55 | 显示全部楼层
zjk 发表于 2020-4-20 08:41
楼主,if((A_flag==1)&&(B_flag==1))这个条件是必须A_flag和B_flag都等于1时才成立吧,而if(A_flag&&B_flag ...

看楼上,这个语句执行与否是不影响程序主体的

出0入475汤圆

发表于 2020-4-20 10:54:01 来自手机 | 显示全部楼层
那要是你这样理解的话,少写一个&符号一样的对。a&b即可

出0入4汤圆

 楼主| 发表于 2020-4-20 11:28:45 | 显示全部楼层
1a2b3c 发表于 2020-4-20 10:54
那要是你这样理解的话,少写一个&符号一样的对。a&b即可

是这么回事,只是好奇怎么会影响系统运行。已关闭了IAR编译优化
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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