查看原文
其他

单片机编程终极奥义之延时

bug菌 最后一个bug 2022-10-14
    /***直击奥义***/
    1)在整个芯片进行上电时需要进行一定时间延时
     主要的原因是因为我们在上电过程中电源还不够稳定,可能会对于芯片内部的初始化带来一定的干扰,导致芯片外设运行异常;同时对于一些初始化比较复杂的外设也需要一个稳定的电源来进行控制,否则容易初始化失败。
      2)主程序的延时该如何选择
      可能对于大部分刚学习的初学者进行延时的话都会选择for语句进行延时,使用for语句主要是造成了程序的死循环来达到延时的目的,对于mcu的程序效率是受很大影响的,下面简单聊一下系统延时这块:
        1、死循环延时
        这种延时的方式主要是对程序的效率会产生很大的影响,而且任务堵塞式的延时会导致其他任务也同样产生延时,任务之间的干扰非常严重,程序效率低(对于带操作系统的任务休眠非死循环延时),同时延时无法做到非常精确,并且移植性不是很好。缺点说了一大堆,既然存在必定有其意义根据平时使用情况来看,首先我们前面说的上电延时,是我们采用死循环延时常用的;同样,我们平时初始化比较复杂的硬件驱动程序,也需要一定的延时,这个时候采用死循环的方式是比较合适的。
        2、累计的方式延时
        累计延时主要是在任务中通过计数变量的累计达到设定的值,然后就可以执行真正的任务处理,在一个任务进行计数等待的同时,对其他也在计数等待的任务影响相比死循环延时大大减少,不过该延时的时间会受到任务执行的时间影响,在延时不是要求很高的情况下可以使用,mcu的利用率也较高。
         3、定时器当时延时
         该办法也是我们单片机编程常用的方式,不过主体也存在主流的两种实现方式,定时器会产生中断并运行中断服务函数,一些人把定时任务放在主体函数中执行,而有部分人把主要的任务放在中断服务函数中执行。
         我们简单说一下这两种方式的使用条件等,首先对于任务放在中断服务函数中,在任务不超过定时时间的情况下,每个任务都能实时执行,对于做实时控制的小伙伴用得比较多,对于有可能超过定时时间的任务程序需要根据mcu的实际应用情况分析,有些mcu会直接无法运行,部分会造成中断丢失,由于没有及时清中断标志位导致无法产生下一次中断等;而对于任务放在任务中执行,也就是我们的前后台架构,注意点跟前面的中断任务方式大体一致,不过一旦总的任务执行超过最小定时时间,最严重的也只是造成当时那一刻的任务执行,或者延时不准确,不过系统不至于存在死机等隐患,该方式基本能够满足我们平时的应用。
    好了,这里是公众号“最后一个bug”,后面我会分享很多有用的编程技巧和学习心得,感谢大家的关注!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存