OpenEdv-开源电子网

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

中断问题

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
发表于 2018-8-5 21:03:54 | 显示全部楼层 |阅读模式
9金钱
最近在用DMA传送ADC的数据,并且设置了一个数据传送完成DMA中断。但是问题来了,在中断里调用显示函数的时候总是莫名奇妙的会出错。在网上查了下说是共享变量的问题,导致主函数和中断函数冲突了。但是我调用的显示函数并没有更改变量的值啊。
然后我用一个变量赋值语句放在主函数调用显示函数的前、后。主函数里调用显示函数时变量赋值为“忙”,调用完之后赋值为“空闲”。然后在中断函数里用这个全局变量判断是否主函数调用了显示函数。这就避免了冲突。

但是,这就会错过很多次中断,请问各位大佬怎么解决!

最佳答案

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

嗯嗯,目前这个方法是最好的了,谢谢了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-5 21:03:55 | 显示全部楼层
warship 发表于 2018-8-5 21:41
在中断函数里设置标志,
进入中断且就置位标志,
在主程序中查询标志,不就和你扫描按键是一个道理吗? ...

嗯嗯,目前这个方法是最好的了,谢谢了
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-5 21:16:12 | 显示全部楼层
这个应该还是显示函数中变量冲突的问题,
主函数也调用,中断函数里也调用,
试想主函数调用一半的时候来了中断,中断里又调用可能会有冲突。
解决的办法,在中断里尽量不要调用显示函数。
显示函数是比较耗时的,为什么非要在中断调用呢?反正主函数也要调用的。
可以在中断函数中设置一个标志,
然后在主函数中查看这个标志,
根据标志的不同来处理显示的工作。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-5 21:35:18 | 显示全部楼层
warship 发表于 2018-8-5 21:16
这个应该还是显示函数中变量冲突的问题,
主函数也调用,中断函数里也调用,
试想主函数调用一半的时候来 ...

后来我修改了一下,在DMA中断函数里获取ADC的值,然后赋值给全局变量。只在主函数中调用显示函数,但是这也有问题,程序好像不能进入中断函数一样,数值不刷新,但是我一按我设置的功能键,数值就会马上刷新。既然我按键有响应(按键处理程序在主函数里),那是不是说明主函数正常,而DMA中断函数没有正常执行呢,这又是为什么呢?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-5 21:41:30 | 显示全部楼层
星邻 发表于 2018-8-5 21:35
后来我修改了一下,在DMA中断函数里获取ADC的值,然后赋值给全局变量。只在主函数中调用显示函数,但是这 ...

在中断函数里设置标志,
进入中断且就置位标志,
在主程序中查询标志,不就和你扫描按键是一个道理吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-5 22:05:34 | 显示全部楼层
warship 发表于 2018-8-5 21:41
在中断函数里设置标志,
进入中断且就置位标志,
在主程序中查询标志,不就和你扫描按键是一个道理吗? ...

还是困惑,虽然问题解决了。
我设置了一个全局变量,也就是“忙”的标志,供中断函数、显示函数使用。一但调用中断函数,变量为“忙”,中断函数结束后为“空闲”。主函数会一直循环调用显示函数,但是显示函数判断这个全局变量是否为“忙”,如果“空闲”则执行显示代码。这样问题解决了。
但是显示函数在执行期间,还是会被中断函数打断呀,中断函数没有判断,只有修改全局变量。按理来说还是会出错,结果出错的问题解决了,延时的问题也解决了哎。
难到单片机在执行中断的时候主函数也能调用显示函数吗?如果是这样,那我前面的做法确实能避免冲突。
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-8-8 11:16:18 | 显示全部楼层
mark一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 15:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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