OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4172|回复: 14

有点很奇怪的现象,前后读取结构体的值改变了

[复制链接]

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
发表于 2017-11-3 15:32:39 | 显示全部楼层 |阅读模式
5金钱
其他程序我就不放了,主要就是一个测量脉宽的实验。
一次更新就是1s,arr是10000,下面我打印了一个计数的总值,然后两种换算成秒的方式。
但是换算秒的公式放在前面和后面的值读出来完全不一样,有点懵逼,求高手指点。
int main()
{
        u32 time,time1,time2;
        USART_Config();
        tim1ic_init();
        printf ( "\r\n按下K1,测试K1按下的时间\r\n" );
        while(1)
        {
                if (tim1initstruct.icfinishflag==1)
                {
                        time1=tim1initstruct.icupdate;
            time2=tim1initstruct.icccr;
                        time=tim1initstruct.icupdate*10000+tim1initstruct.icccr;
                        printf("高电平时间为: %.4f s\r\n",(float)(time1)+((float)time2)/10000);  
                        printf("高电平时间为: %d s\r\n",time);
                        printf("高电平时间为: %.4lf s\r\n",(double)(time)/(double)(10000));
                        time=tim1initstruct.icupdate*10000+tim1initstruct.icccr;
                        printf("高电平时间为: %.4lf s\r\n",(double)(time)/(double)(10000));   //很奇怪 后面在读这个数的时候数值变了
                        tim1initstruct.icfinishflag=0;
                }
        }
       
}

最佳答案

查看完整内容[请看2#楼]

仿真,看看原始数据是否一致?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-3 15:32:40 | 显示全部楼层
仿真,看看原始数据是否一致?
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-11-3 15:42:36 | 显示全部楼层
你看看你中断里面结构体那俩个变量是不是在自加;
tim1initstuct.icupdate这个变量是全局变量吧,他一直在++
自己选择的路,成家前走完。
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-3 23:38:43 来自手机 | 显示全部楼层
aiyeba 发表于 2017-11-3 15:42
你看看你中断里面结构体那俩个变量是不是在自加;
tim1initstuct.icupdate这个变量是全局变量吧,他一直在++

的确是在自加,但是自加的速度是一秒一次,应该没那么快啊,而且上面一个打印出来高电平时间是五六秒的时候,放到后面打印出来就只有0.1秒什么的了。
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-4 08:49:42 | 显示全部楼层
比如 我按下的时间是 0.1419秒,前面三个显示的分别是 0.1419s,1419s,0.1419s,计算公式放到后面 打印出来就变成了0.0000s,但是有的时候值又是正常的,不知道哪里有问题,感觉很奇怪。
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-4 13:51:51 | 显示全部楼层
怎么没有人啊,自己手动刷
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-11 15:45:03 | 显示全部楼层
正点原子 发表于 2017-11-6 01:13
仿真,看看原始数据是否一致?

不好意思,我以为没人回复我了呢,我仿真看了一下,应该是因为更新中断的数值在自加,导致数值不一样,但我还是不太明白,即使数值不一样,不是也应该是大一点吗,为什么有时候会是0
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-12 01:51:45 | 显示全部楼层
蛋白质khun 发表于 2017-11-11 15:45
不好意思,我以为没人回复我了呢,我仿真看了一下,应该是因为更新中断的数值在自加,导致数值不一样,但 ...

单步跟踪,看看到底怎么回事?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-13 14:55:17 | 显示全部楼层
正点原子 发表于 2017-11-12 01:51
单步跟踪,看看到底怎么回事?

我单步调试和设置断点都尝试了一下,在if前面设置了断点,全速运行到这里就改单步调试,每一步我看到计数器的值都变得很快,但似乎进不了更新中断,所以变量值一直不变,输出的结果也是正确的,如果后面我也是改成设置几个断点全速运行,icupdate的值每到一个断点数值都自加1,所以输出结果 第一个是 1.1492s,第二个就是2.1492s,最后一个是3.1492s
原子大哥啊,求解惑啊,
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-13 15:01:32 | 显示全部楼层
正点原子 发表于 2017-11-12 01:51
单步跟踪,看看到底怎么回事?

假如我调试的时候不设置断点一直全速运行,那我输出的结果 要么最后一个数值就和前面是一样的,这是正确结果,要么就是0。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-14 01:15:10 | 显示全部楼层
蛋白质khun 发表于 2017-11-13 15:01
假如我调试的时候不设置断点一直全速运行,那我输出的结果 要么最后一个数值就和前面是一样的,这是正确 ...

写个if,在if里面设置断点。
这种很简单的思路,自己要回去想。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-14 11:48:47 | 显示全部楼层
正点原子 发表于 2017-11-14 01:15
写个if,在if里面设置断点。
这种很简单的思路,自己要回去想。

我在主函数的if语句里,第一个printf前添加一个延时函数,最后一个打印出来的数就正确了,不能理解原因,为什么要在打印之前延时
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-14 14:03:23 | 显示全部楼层
正点原子 发表于 2017-11-14 01:15
写个if,在if里面设置断点。
这种很简单的思路,自己要回去想。

断点什么的我都设置了,中断和主函数里设置了几个断点,每到一个断点才重新运行都会先进一趟更新中断,如果主函数我只在if后面设置断点,那么运行一切正常,如果不加断点全速,最后一个输出结果又变成0了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-14 20:12:32 | 显示全部楼层
蛋白质khun 发表于 2017-11-14 14:03
断点什么的我都设置了,中断和主函数里设置了几个断点,每到一个断点才重新运行都会先进一趟更新中断,如 ...

判断值之后,再printf
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-11-15 10:11:59 | 显示全部楼层
正点原子 发表于 2017-11-14 20:12
判断值之后,再printf

谢谢,我想我找到原因了,硬件不稳定,导致又进入捕获中断了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 12:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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