OpenEdv-开源电子网

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

delay函数的问题,好久了么有解决

[复制链接]

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
发表于 2018-11-18 15:16:58 | 显示全部楼层 |阅读模式
1金钱
原子哥的delay函数是用的滴答定时器,好是挺好的,但是我前一段时间发现个问题就是,我主函数里面用到delay函数 定时器中断也用到delay函数,导致延时不正常了,如果只有主函数用延时函数的话是正常的。主函数和定时器中断同时用就不正常了。我初步分析了一下,当主函数正在延时的过程中,这个时候定时器中断了,并且进入了一个中断函数中的延时函数,由于主函数还没有运行完delay函数,进入中断中的延时函数时导致滴答定时器寄存器里面的有关数据丢失,所以导致不准确了,这种情况怎么避免?难道必须的用软件定时吗?有没有别的方法解决这个问题。呼叫各位大神。

最佳答案

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

是会有影响。因为默认的delay是不可重入的。 所以,中断里面和其他地方一起要用delay的话,自己重写一个给中断用吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-18 15:16:59 | 显示全部楼层
是会有影响。因为默认的delay是不可重入的。
所以,中断里面和其他地方一起要用delay的话,自己重写一个给中断用吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-18 16:50:20 | 显示全部楼层
中断函数尽可能快,为啥要在中断里面加延时?
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2018-11-18 18:20:25 | 显示全部楼层
函数重入的问题,你实在要在中断中延时就用查询定时器的计数器延时吧
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-19 00:02:49 | 显示全部楼层
我是从来不建议用这类delay函数的, 但就事论事, 不管是什么函数, 只要是主线程跟中断都会调用的话就一定要考虑重入, 要是觉得复杂, 那就多写一个int_delay函数, 独立的给中断用啊
回复

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2018-11-19 20:07:04 | 显示全部楼层
szczyb1314 发表于 2018-11-18 16:50
中断函数尽可能快,为啥要在中断里面加延时?

因为我中断里面有一个IIC通讯,没间隔50ms需要检测一次,iic通讯scl  sda需要延时
回复

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2018-11-19 20:07:30 | 显示全部楼层
edmund1234 发表于 2018-11-19 00:02
我是从来不建议用这类delay函数的, 但就事论事, 不管是什么函数, 只要是主线程跟中断都会调用的话就一定 ...

谢谢
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-20 08:17:22 | 显示全部楼层
47933673 发表于 2018-11-19 20:07
因为我中断里面有一个IIC通讯,没间隔50ms需要检测一次,iic通讯scl  sda需要延时

中断里给个falg,主程序中快速查询这个flag去iic通信
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-5-2
在线时间
23 小时
发表于 2018-11-20 11:12:41 | 显示全部楼层
本帖最后由 suzongyao1120 于 2018-11-20 11:14 编辑

回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-11-20 11:18:52 | 显示全部楼层
47933673 发表于 2018-11-19 20:07
因为我中断里面有一个IIC通讯,没间隔50ms需要检测一次,iic通讯scl  sda需要延时

不管怎么说,
中断服务函数里面,
居然用到50ms的延时,
这个必须禁止的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-11-20 13:08:51 | 显示全部楼层
我一般用轮询CNT值的方式来延时,不用比较中断来延时。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 23:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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