查看: 21562|回复: 16
为什么尽量在单片机中断函数中不要使用延时?
[复制链接]
ID:330668
当前离线
积分461
电梯直达
楼主
ID:330668
发表于 2018-5-15 19:04
|
只看该作者
|倒序浏览
|阅读模式
为什么尽量在单片机的中断函数中不要使用延时 ,我们老师这样说了,但还没告诉我们原因
我们现在开始接触单片机,还不清楚后面的知识。为什么尽量不要用延时呢 求问各位大佬
分享到:
QQ好友和群
QQ空间
腾讯微博
腾讯朋友
收藏1
淘帖0
顶0
踩0
回复
使用道具
举报
ID:155507
当前离线
积分40517
来自 9#
ID:155507
发表于 2018-8-31 18:53
|
只看该作者
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。
所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。
评分
参与人数 1黑币 +60
收起
理由
admin
+ 60
回帖助人的奖励!
查看全部评分
回复
使用道具
举报
ID:389283
当前离线
积分557
沙发
ID:389283
发表于 2018-8-31 08:38
|
只看该作者
使用延时导致整体的效率变低,相当于机器在空转,没有做任何事,空转的这段时间可以去干其他的事情
回复
使用道具
举报
ID:391903
当前离线
积分103
板凳
ID:391903
发表于 2018-8-31 11:07
|
只看该作者
CPU利用率降低,代码执行周期较长!
回复
使用道具
举报
ID:391335
当前离线
积分18
地板
ID:391335
发表于 2018-8-31 16:08
|
只看该作者
中断等级比较高,CPU会优先处理中断,延时有点浪费资源
回复
使用道具
举报
ID:392046
当前离线
积分53
5#
ID:392046
发表于 2018-8-31 16:36
|
只看该作者
中断其实就是让你mcu临时干一下别的工作,中断函数越精简,程序理论效率越高。以后接触到操作系统你就会有深入的体会。
回复
使用道具
举报
ID:34853
当前离线
积分257
6#
ID:34853
发表于 2018-8-31 17:19
|
只看该作者
51黑电子是个好的学习网站,帮助了我很多 谢谢
回复
使用道具
举报
ID:1
当前离线
积分12130
7#
ID:1
发表于 2018-8-31 17:21
|
只看该作者
somayboy 发表于 2018-8-31 17:19
51黑电子是个好的学习网站,帮助了我很多 谢谢
不要发与提问无关的内容,这样会影响到
回复
使用道具
举报
ID:392085
当前离线
积分20
8#
ID:392085
发表于 2018-8-31 18:17
|
只看该作者
中断触发时会跳进中断中执行,而主函数中的程序会压入堆栈中停止执行。如果主函数中程序很短,中断执行的时间可以长。具体的需要根据所要实现的具体功能而定,机器是死的,人是活的。
回复
使用道具
举报
ID:367460
当前离线
积分1028
10#
ID:367460
发表于 2018-8-31 19:27
|
只看该作者
杜绝纯延时 ,如果代码多的话 完全是浪费时间,小的程序或许不明显,但是假如你将来做大一点的程序的话 弊病就显示出来了,浪费cpu 用定时器中断就比较好了
回复
使用道具
举报
ID:155507
当前离线
积分40517
11#
ID:155507
发表于 2018-8-31 19:32
|
只看该作者
尽量在单片机中断函数中不要使用延时,如果调用延时函数。 如果延时函数时间过长,则下次中断有可能不会被触发,类似按键不灵敏,还有可能因为中断和主程序都在使用延时函数,而和此相关的寄存器的值没有保存,导致延时时间出错。
回复
使用道具
举报
ID:391754
当前离线
积分28
12#
ID:391754
发表于 2018-8-31 22:28
|
只看该作者
不光是中断,就是任务中,一般都不要用过长的delay,时间长 可以用定时器,在定时器中设置变量,在程序中查询,用了过多delay,这个叫阻塞了,而且中断有优先级,如果高优先级的中断中,使用了延时函数,低中断可能会遗漏
回复
使用道具
举报
ID:405708
当前离线
积分1809
13#
ID:405708
发表于 2018-10-21 11:27
|
只看该作者
本帖最后由 psuxaog 于 2018-10-21 11:42 编辑
如果你用定时中断置标志位,主程序查询标志位的情况,如果中断中有延时,且大于定时时间,此时会出现主程序无法执行的情况,如果有用到看门狗,单片机会重复复位,即使没有看门狗,主程序中的程序不运行也是要命的。
中断中用的变量也是有讲究的,比如以下情况:
下面的代码中gValTmp是16位变量,TMP_Process是主循环中的程序,51单片机是8位机,给gValTmp赋值的时候是一个字节是个字节处理的,16位是两个字节,如果已经处理了第一个字节的时候发生了中断,那中断中的gValTmp的值就不是正常的值(另一个字节没有刷新呀),会导致数据错乱。
u16 gValTmp = 0;
void TIM0_IRQ interrupt IRQ_T0
{
TL0 = XXX;
TH0 = XXX;
TMP_SendData(gValTmp);
}
void TMP_Process(void)
{
gValTmp = TMP_GetValue();
}
复制代码将以上代码稍作修改,这个问题就可以解决了:
u16 gValTmp = 0;
bit gFlagUpdated = 0;
void TIM0_IRQ interrupt IRQ_T0
{
TL0 = XXX;
TH0 = XXX;
if(gFlagUpdated)
{
gFlagUpdated = 0;
TMP_SendData(gValTmp1);
}
}
void TMP_Process(void)
{
gValTmp = TMP_GetValue();
gFlagUpdated = 1;
}复制代码除了以上两种方式,也可以在赋值前关中断,赋值后开中断的方式,不会不推荐这样方式,容易导致时基不准。
回复
使用道具
举报
ID:413031
当前离线
积分16
14#
ID:413031
发表于 2018-10-21 12:50
|
只看该作者
中断里面加了延时的话,会导致下一个中断不能及时响应
回复
使用道具
举报
ID:413081
当前离线
积分8
15#
ID:413081
发表于 2018-10-21 13:48
|
只看该作者
因为没有必要,反而增加了系统负担,增加了处理时间。
回复
使用道具
举报
ID:413082
当前离线
积分12
16#
ID:413082
发表于 2018-10-21 13:58
|
只看该作者
中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。
回复
使用道具
举报
ID:413154
当前离线
积分25
17#
ID:413154
发表于 2018-10-21 16:48
|
只看该作者
中断容易产生混乱
回复
使用道具
举报