单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。

单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。,第1张

跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光亩罩改二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1

//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此

th0=(65536-45872)/256

//重新装载初值tl0=(65536-45872)%256才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void

t0_time()这个函数中重新赋迅判初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01

//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?

(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定闷判时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)

中断服务程序过长,可能会出现两种情况:

1.运行时间过长,影响同优先极及低优先级的中断的响应,可能单片机就忙着处理中断去了,进而影响后台程序的运行;高优先级的中断在当前中断仿液则响应,会作压栈处理,堆栈空间需求量增大,严重的情况是堆栈备棚空间不够用,程序混乱。

2.中断内部函数嵌套过多,堆栈空间需求量增大,严重的情况是埋誉堆栈空间不够用,程序混乱。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12557898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存