打印
[STM8]

STM8调试问题

[复制链接]
楼主: LSLDAY
手机看帖
扫描二维码
随时随地手机跟帖
21
LSLDAY|  楼主 | 2017-8-15 17:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
首先感谢各位老哥热心回答  ,这次我把管脚电平值贴出来了  我计算着P==1还是不对

1111.png (301.12 KB )

1111.png

使用特权

评论回复
22
LSLDAY|  楼主 | 2017-8-15 17:44 | 只看该作者
zzjj44 发表于 2017-8-15 15:39
这个表达式右值只有三个同时为0,左值才为0,在你不能保证它们同时为0的情况下,你怎么能想P就是0呢!写 ...

我把管脚电平值贴到21楼了  ,老哥可以帮忙去看看么

使用特权

评论回复
23
LSLDAY|  楼主 | 2017-8-15 17:45 | 只看该作者

我把管脚的电平值截图放21楼了 ,可以看下  

使用特权

评论回复
24
戈卫东| | 2017-8-15 18:24 | 只看该作者
LSLDAY 发表于 2017-8-15 17:45
我把管脚的电平值截图放21楼了 ,可以看下

问题不是这个。
问题是,你对管脚的N次访问,是不是并不一样。

使用特权

评论回复
25
streetkid| | 2017-8-15 18:24 | 只看该作者
你可以把那一句分开写,看看每一步出来的值是什么。

使用特权

评论回复
26
戈卫东| | 2017-8-15 18:26 | 只看该作者
不过,我觉得发生了变化的可能性不大。
那么是编译器有BUG?
换一种试试?

使用特权

评论回复
27
小风车| | 2017-8-15 20:23 | 只看该作者
我上次也遇到了,我的是板子问题,芯片工作不正常,换了块板子就好了,不知道你是不是

使用特权

评论回复
28
LSLDAY|  楼主 | 2017-8-15 21:00 | 只看该作者
小风车 发表于 2017-8-15 20:23
我上次也遇到了,我的是板子问题,芯片工作不正常,换了块板子就好了,不知道你是不是 ...

21L截图中的   把P的赋值表达式分开写,得出来的 就是 k,m,o  的赋值表达式

使用特权

评论回复
29
LSLDAY|  楼主 | 2017-8-15 21:01 | 只看该作者
小风车 发表于 2017-8-15 20:23
我上次也遇到了,我的是板子问题,芯片工作不正常,换了块板子就好了,不知道你是不是 ...

21L截图中的   把P的赋值表达式分开写,得出来的 就是 k,m,o  的赋值表达式

使用特权

评论回复
30
LSLDAY|  楼主 | 2017-8-15 21:02 | 只看该作者
小风车 发表于 2017-8-15 20:23
我上次也遇到了,我的是板子问题,芯片工作不正常,换了块板子就好了,不知道你是不是 ...

我把第二块板子焊好。明天试试看

使用特权

评论回复
31
LSLDAY|  楼主 | 2017-8-15 21:03 | 只看该作者
戈卫东 发表于 2017-8-15 18:26
不过,我觉得发生了变化的可能性不大。
那么是编译器有BUG?
换一种试试? ...

就这一个开发环境 STVD   ,难道不可能是调试器的问题么

使用特权

评论回复
32
戈卫东| | 2017-8-15 21:34 | 只看该作者

你这两种搞法其实不是等效的。
虽然看起来应该一样,但它就是不一样。。。。。。

使用特权

评论回复
33
戈卫东| | 2017-8-15 22:00 | 只看该作者
我看了汇编码,编译器很不讲理地直接把p赋值了1,根本就没有看那些输入值。。。。

使用特权

评论回复
34
戈卫东| | 2017-8-15 22:04 | 只看该作者

使用特权

评论回复
35
crystal1987| | 2017-8-16 08:51 | 只看该作者
LSLDAY 发表于 2017-8-15 11:20
嗯,但是后面我给p赋值了啊,都执行完成赋值语句了 但是值不对

从你程序的角度来说,P和Q的值有可能是不一样的,因为在程序执行的过程中,寄存器里面的值有可能是会发生变化的。

使用特权

评论回复
36
LSLDAY|  楼主 | 2017-8-16 09:23 | 只看该作者
戈卫东 发表于 2017-8-15 22:00
我看了汇编码,编译器很不讲理地直接把p赋值了1,根本就没有看那些输入值。。。。 ...

P直接赋值1?    额,卫东老哥,这是为什么呢  还有你用的也是STVD的IDE么

使用特权

评论回复
37
LSLDAY|  楼主 | 2017-8-16 09:28 | 只看该作者
crystal1987 发表于 2017-8-16 08:51
从你程序的角度来说,P和Q的值有可能是不一样的,因为在程序执行的过程中,寄存器里面的值有可能是会发生 ...

我确定没变化的,因为凡是不确定的管脚位我都给或1,剩下的管脚或0的都是带外部上拉的,没有输入值

使用特权

评论回复
38
戈卫东| | 2017-8-16 10:27 | 只看该作者
LSLDAY 发表于 2017-8-16 09:23
P直接赋值1?    额,卫东老哥,这是为什么呢  还有你用的也是STVD的IDE么

不是。
我用的IAR EWARM。

使用特权

评论回复
39
zzjj44| | 2017-8-16 14:32 | 只看该作者
LSLDAY 发表于 2017-8-15 17:15
嗯 这个我知道 右值三个同时为0   左值才等于0;  但这里我保证  ~(PD_IDR|0x03);      ~(PI_IDR|0x3f);   ...

在编译器VC6中,执行结果也相同。先看看分别给p和q赋值的汇编代码及其单步执行顺序:


我们发现:第一,逻辑相同的情况下,两者的汇编代码不同;第二,两者的执行顺序不同;第三,也是最关键的一点,两者使用寄存器的方式不同。
在给p赋值的过程中,分别用到了32位寄存器eax,ecx,edx,和16位寄存器a1,c1,d1.求第一个逻辑因子的时候,在jne处发生跳转,说明test处执行结果不为0.为什么会不为0呢?根据执行顺序:首先,eax=0x0000 0000,接着,a1=0x00ff,(我猜测)在执行not的时候,a1进行数据扩充,于是eax = 0x0000 00ff,not以后,变成0xffff ff00,而执行test以后,结果为(真真为真)1.所以不为0.
而在给q赋值的过程中,只有32位寄存器,开始时,edx = 0x0000 0000,在and后,edx = 0x0000 0000(0FF也要扩充),test时,结果为0(有假则假),当然也不存在jne跳转。
为了验证这个猜测,我把 unsigned char k,m,o 变成 unsigned int k,m,o后,结果k = m = o = -255,p = q = 1.

使用特权

评论回复
40
crystal1987| | 2017-8-17 10:19 | 只看该作者
大拇指

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则