找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6221|回复: 16
收起左侧

单片机程序用delay延时会造成阻塞吗

  [复制链接]
ID:525511 发表于 2019-10-24 17:05 | 显示全部楼层 |阅读模式
iic.png

我看网上的例程,I2C,液晶时序等都用了很多的delay延时函数,里面就是个空循环,实际项目开发中也是这样用的吗?这样不会影响速度吗?
假如I2C有很多数据要读写,这些delay加起来的延时就不少了吧,这样程序不就是光在I2C上耗着了,其它事也处理不了啦?程序会阻塞吧?
再万一在延时的时候遇上中断了,I2C上的数据不会错乱吗?
回复

使用道具 举报

ID:235200 发表于 2019-10-24 18:13 | 显示全部楼层
该延时一般只有5us左右,是IIC读写时序要求的,读写速度符合IIC总线规范,如遇中断,中断程序应该保护原程序的现场,不会造成混乱,万一偶尔出错,程序应该具有纠错功能
回复

使用道具 举报

ID:123289 发表于 2019-10-24 20:17 | 显示全部楼层
你是怀疑完全正确,确实会发生你所担心的事!所以高手多不用这种“硬”DELAY做延时。
沙发的说法,我不赞同。中断会占用CPU时间,这个时间多长,又不确定,极可能使原先程序的时序受到干扰而出错。
回复

使用道具 举报

ID:401564 发表于 2019-10-25 08:44 | 显示全部楼层
延时本来的目的就是为了阻塞呀!就是为了让程序在这等着
对于中断而言,现场保护是一定要有的
进入中断之后就先把IIC相关的数据先保存,中断返回之前再取回数据就可以了,IIC的工作是有时钟的,进入中断了,时钟也跟关闭了,IIC器件就停止数据传输了,中断返回再继续工作就可以了

对于你所说的问题,不同的人会有不同的解决方法,可以考虑使用硬件IIC,有的单片机是有硬件IIC端口的.

回复

使用道具 举报

ID:625395 发表于 2019-10-25 09:11 | 显示全部楼层
学习了,都是经验丰富的高手啊。太赞了.
回复

使用道具 举报

ID:525511 发表于 2019-10-25 14:34 | 显示全部楼层
Y_G_G 发表于 2019-10-25 08:44
延时本来的目的就是为了阻塞呀!就是为了让程序在这等着
对于中断而言,现场保护是一定要有的
进入中断之后 ...

就是说延时是必不可少了?单片机速度再快也没用,如果使用IIC的话整个系统的速度就会被IIC拖慢了?
有没有可能延时的这段时间去做其它事,程序不用在这等着?

硬件IIC这个并不是每一个单片机都有呀
回复

使用道具 举报

ID:525511 发表于 2019-10-25 14:35 | 显示全部楼层
yzwzfyz 发表于 2019-10-24 20:17
你是怀疑完全正确,确实会发生你所担心的事!所以高手多不用这种“硬”DELAY做延时。
沙发的说法,我不赞 ...

如果不用delay延时,还有什么做法呢?
回复

使用道具 举报

ID:525511 发表于 2019-10-25 14:42 | 显示全部楼层
csmyldl 发表于 2019-10-24 18:13
该延时一般只有5us左右,是IIC读写时序要求的,读写速度符合IIC总线规范,如遇中断,中断程序应该保护原程序的 ...

读写速度是能够符合IIC的规范,我的意思不是说影响IIC的数据速度,而是其它地方的,比如同一系统上有IIC也
有SPI,CAN等等速度比IIC快的,但用IIC的时候用了delay延时了,程度在那等着了,其它地方不动了,那整个系统的运行速度不是被拖慢了?
回复

使用道具 举报

ID:606366 发表于 2019-10-25 16:00 | 显示全部楼层
老夫任我行 发表于 2019-10-25 14:42
读写速度是能够符合IIC的规范,我的意思不是说影响IIC的数据速度,而是其它地方的,比如同一系统上有IIC ...

系统的运行速度是跟芯片的频率有关,这个延时是根据IIC的时序来的,其他地方比iic快的话当程序运行到延时函数的时候并不是在等待,而是一直在做运算,碰到中断,处理完中断程序后,如果不影响iic的读写操作是可以的,毕竟中断里的代码一般不会有延时,处理起来比较快
回复

使用道具 举报

ID:332444 发表于 2019-10-25 17:12 | 显示全部楼层
首先要考虑的是IIC时序的空隙是否能够利用?如果能够利用,那才有讨论的余地。
回复

使用道具 举报

ID:235200 发表于 2019-10-26 01:52 | 显示全部楼层
yzwzfyz 发表于 2019-10-24 20:17
你是怀疑完全正确,确实会发生你所担心的事!所以高手多不用这种“硬”DELAY做延时。
沙发的说法,我不赞 ...

你用的词是"极可能",不是一定会出错,我也没说不会出错,对编程者来说,就是要在程序中避免这种出错,提高通信的可靠性,所以如果偶尔发生了错,程序要能舍弃错误的数据,重新获取正确的数据,因此不会造成IIC读取出来的数据错乱楼主所提到的担心拖慢系统速度,这是毫无疑问的,计算机主频3GHz,但外设均达不到这个速度,只要与外设通信,一定会拖慢速度,设计系统是只有选较快的外设才能提高系统速度
回复

使用道具 举报

ID:401564 发表于 2019-10-26 10:17 | 显示全部楼层
老夫任我行 发表于 2019-10-25 14:34
就是说延时是必不可少了?单片机速度再快也没用,如果使用IIC的话整个系统的速度就会被IIC拖慢了?
有没 ...

不管是IIC还是在其它器件,有的延时是一定要有的,情况也确实是像你所说的那样,这延时一下,那延时一下,MCU会花很多的时间在等待延时上,整个的系统也是会慢很多
但这也只是相对于MCU的执行时间而言的,但更多的时候,对于实际应用来说,单片机反而是太快了,有时候是不需要那么快的
打个比方,你这个是一个自动出售饮水的机器,IIC器件用于保存今日总收入,那么,你想一下,当一个人完成交易到下一个人来进行交易的时候,中间至少也是几秒钟的时间,对于几个MHZ的单片机来说,这几秒就可以几百万条指令了,或者是说,你机器给水多供水1mS和少供水1mS是没有区别的.或者是一个自动开关灯电路,早开0.001秒和晚开0.001秒,区别并不大,等于是没有区别的了

当然,也会有对时间要求相当高的应用,遇上这种情况,一般都是按照代行等级来重新设定元件和程序的,比如,你的电路对于一个几微秒的时钟信号一定要捕捉到,那么,就以这一点为最高优先等级,其它的设定都得为这个让路:不用IIC器件,捕捉使用最高等级的中断,捕捉相关代码使用汇编语言
回复

使用道具 举报

ID:373499 发表于 2019-10-26 12:42 | 显示全部楼层
确实是会堵塞,但是只堵塞个几us,这个不用担心的
回复

使用道具 举报

ID:523997 发表于 2019-10-26 16:18 | 显示全部楼层
延时有两种方法,一种是用软件延时,即写延时子程序,这种方法是让单片机执行无用的指令,就是为了延时,延时期间就不能做其他事情了,很浪费单片机的时间。这种方法是在单片机不忙的情况下用,反正闲着也是闲着。 第二种方法就是你要求的,即能延时,又不耽误主程序的运行,用定时器T0或T1定时,设置定时时间后,定时器开始计时,主程序继续执行,不用管定时器,当定时时间到,定时器就会申请中断,单片机就响应中断,处理定时子程序需要完成的工作,完成后返回到主程序继续主程序的执行,这是最合理的方法,充分利用了单片机的资源,互不影响。
回复

使用道具 举报

ID:517758 发表于 2019-10-26 21:35 | 显示全部楼层
delay函数会造成后续代码阻塞,一般会将代码放到中断中处理
回复

使用道具 举报

ID:630739 发表于 2019-10-27 00:36 | 显示全部楼层
会呀  延时不就是用代码阻塞嘛
回复

使用道具 举报

ID:630813 发表于 2019-10-27 10:59 | 显示全部楼层
应该会吧
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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