吴坚鸿单片机程序框架-精彩评论-交流讨论-hbc0602

hbc0602:

我也是个初学者,我有个疑惑:如果我定时器定为2ms,像楼主说的那样,定义一堆标志位来累计定时中断次数去做不同的事情,每次进入中断先关掉定时器,做完相关的变量计算后再重新启动定时器。这样如果关掉和启动定时器中间代码量很多,那定时2ms不是不准了吗?比如2ms进入中断,关掉后处理中间的代码花费了一定的时间。虽然每次还是2ms进入中断,但是实际等待的时间不止2ms了。。。
还有,如果用定时器来做延时,那么每次用来延时的累计变量和标志位都不应该相同吧?比如调用子函数1要延时10ms,调用子函数2要延时20ms,如果用同一变量来判断是不能实现的...而且如果用了定时器来做延时,也不能写delay函数(用for循环的自减来消耗时间)了吧?这deley函数执行的过程中定时器中断已经进入N遍了...有些动作会被漏掉。
拜托指教...

吴坚鸿:

(1)你看到我在定时中断里代码很多,实际上这些代码执行的时间很短。即使这个时间稍微长点也没关系,虽然不能按照你所想的每2ms来中断一次,可能是5ms,但是每次进入中断到退出中断的时间是固定有规律的,这样我们可以通过最后修正累计定时中断次数来达到我们想要的时间,当然,我一开始就主张没必要企图让单片机做太高精度的时间,对于绝大多数的项目,这样大概的时间是绰绰有余的。
(2)delay函数一般应用在驱动时序的短延时,甚至在一些驱动时序中(比如IIC),可以先关闭所有的中断再去执行驱动时序。在我的程序框架中,delay函数的大延时几乎不会应用在主函数的while(1)循环里。
(3)至于定时器的延时和delay延时的关系,其实我已经在例程里循序渐进地讲得很清楚,你如果有兴趣,你应该从我的第一节开始学起,自己动手做做实验。你只有了解了我switch状态机程序框架的核心思路,你自然就会明白它们的关系。

 

hbc0602:

谢谢回复,我正在慢慢学习你的教程,因为遇到这些问题想不明白所以提问。
我是疑惑不管delay函数是否放在while(1)大循环里,怎么让它和定时中断“和平相处”。你说的如果把所有中断都停掉再去执行驱动时序,那定时器这段时间因为停摆不是会错过一些任务的执行了?(比如键盘扫描)。
还有一个问题没有提及,就是如果用定时器来做delay延时,因为不同的时候调用delay可能会需要长短不一的延时,而我上一个提问中说到,不能只定义一个累积定时中断变量,而是每个delay必须有一个独立定义的变量和标志位。是这样吗?

吴坚鸿:

(1)即使不关闭中断,delay函数和定时中断是天生“和平共处”的,你不用过于担心。因为定时中断的时间间隔是固定的,即使在执行delay函数的时候被中断了一会,也不会有影响,只要你根据实际延时时间的需求来修改delay函数内部的执行指令次数就可以。这个时候不要严格按照时间计算公式去算,要凭感觉和实际反馈的时间来调整。
(2)即使关闭了中断,也不会错过一些任务执行(比如按键扫描)。因为delay函数是用在偶尔的驱动时序上,在系统上不做长延时用。因此关闭定时中断的时间是很短的。
(3)定时器的叫计数延时,没错,不同的计数延时要不同的变量。而delay延时是死延时,不要把计数延时跟delay延时混为一谈。不要企图用定时器来做delay延时,否则就跟死延时delay没有什么差别的。计数延时是基于整个系统框架的,delay延时只是局限于某个内部驱动时序,需要一气呵成,不能执行其他非中断任务。而定时器延时可以边延时边干其它的事情,是并行处理的。

 

 

永不止步步 发表于01-24 16:41 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345327个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号