我是疑惑不管delay函数是否放在while(1)大循环里,怎么让它和定时中断“和平相处”。你说的如果把所有中断都停掉再去执行驱动时序,那定时器这段时间因为停摆不是会错过一些任务的执行了?(比如键盘扫描)。
还有一个问题没有提及,就是如果用定时器来做delay延时,因为不同的时候调用delay可能会需要长短不一的延时,而我上一个提问中说到,不能只定义一个累积定时中断变量,而是每个delay必须有一个独立定义的变量和标志位。是这样吗?
吴坚鸿回复:
(1)即使不关闭中断,delay函数和定时中断是天生“和平共处”的,你不用过于担心。因为定时中断的时间间隔是固定的,即使在执行delay函数的时候被中断了一会,也不会有影响,只要你根据实际延时时间的需求来修改delay函数内部的执行指令次数就可以。这个时候不要严格按照时间计算公式去算,要凭感觉和实际反馈的时间来调整。
(2)即使关闭了中断,也不会错过一些任务执行(比如按键扫描)。因为delay函数是用在偶尔的驱动时序上,在系统上不做长延时用。因此关闭定时中断的时间是很短的。
(3)定时器的叫计数延时,没错,不同的计数延时要不同的变量。而delay延时是死延时,不要把计数延时跟delay延时混为一谈。不要企图用定时器来做delay延时,否则就跟死延时delay没有什么差别的。计数延时是基于整个系统框架的,delay延时只是局限于某个内部驱动时序,需要一气呵成,不能执行其他非中断任务。而定时器延时可以边延时边干其它的事情,是并行处理的。