首页|资源下载
登录|注册

您现在的位置是:首页 > 技术阅读 >  延时功能进化论之概述

延时功能进化论之概述

时间:2022-09-30


导读:最强干货,不仅适用于单片机应用场合,其他任何需要延时的平台都可以借鉴参考!

在这篇长达万字的长文中,鱼鹰将通过延时这种刚需功能聊聊溢出、可重入、编程思想、共享变量保护等方面内容,以延时功能为载体,能更好的理解这些缥缈的知识点。
本篇长文将分成五篇陆续发布:概述、V1.0~V1.5、V1.7、V2.0~V2.4、V2.5~V2.7。版本V3.x留给对本公众号发展有帮助的道友,更新结束后可在公众号后台回复关键字获取(领取条件请点击文末阅读原文
在生活中,时间与我们的生活息息相关,日出而作,日落而息,说的就是利用太阳来大概判断时间,从而规划自己的作息。而在单片机领域,同样需要一个时间去控制你的代码运行情况。
玩单片机的应该都了解过晶振,很多初学者可能会从前辈那里得到这样一个比喻:单片机的心脏。从功能的角度来说确实如此,因为单片机代码确实是依靠晶振执行的,比如说晶振输出一个脉冲,CPU执行一条指令,就像心脏跳动一次,你做一个抬手动作。只不过你的心脏可能1秒只能跳动几十次,而晶振1秒输出脉冲几十兆赫兹(1 MHz = 1,000 KHz = 1000,000 Hz),而一般单片机还会将晶振输出的频率进行倍频,倍频后的频率才最终用于驱动CPU的运行。
如果说现实生活中,时间的最小单位是秒(应该没人在生活和工作中去精确到毫秒吧,更多可能是分钟),而在单片机领域,常用的时间单位应该是毫秒、微秒、纳秒,而决定时间精度的就是晶振(更准确的说是经过晶振分频、倍频后的系统时钟,比如说 STM32 的 8 M 晶振分频成 1 M,然后倍频成 72 M 作为系统时钟驱动 CPU,进而执行存储器中的代码)。
对于应用开发来说,可能他不会去了解晶振频率多少,系统频率多少,一条指令运行时间又是多少?他们更多的需求是,在多少毫秒、多少秒(微秒很少用)之后这段代码执行一遍,这个界面刷新一遍,然后以这个时间为周期,循环执行。这是利用延时功能去达到特定代码周期执行的目的。
延时可分为相对延时和绝对延时,相对延时与绝对延时的差别可看下图理解:
(在后面介绍的几种延时演进版本中,可自行思考采用何种方式延时)
本篇笔记将根据鱼鹰多年编程经验介绍自己如何实现延时功能。说是进化论,不如说是鱼鹰个人延时功能的使用演进过程。
说到延时函数,51单片机过来的道友脑中应该会想起郭天祥老师视频中的延时函数,而使用原子例程的道友会想起例程中使用systick定时器实现的延时功能,尽管他们的实现方式有所不同,但他们都是采用死等的方式达到延时功能(所谓死等,有个比喻鱼鹰觉得挺恰当的:驴拉磨,让CPU一直在一个地方打转,时间到了就离开这个地方)。
死等方式确实很容易理解,也很容易实现,但是它的弊病也很明显,不说它极大的浪费了CPU的资源(在延时过程中,除了能处理中断,后面的代码无法处理),更重要的是影响的代码的执行效果,比如说你有一个功能时需要20毫秒执行一次,而你的另一个功能却需要30毫秒执行,那你如何采用死等方式处理其中的矛盾呢?
既然是进化论,为了笔记的完整性,鱼鹰将根据自己使用过的延时函数进行一一说明。

意犹未尽?明天更精彩!


推荐阅读:

为什么说你一定要掌握 KEIL 调试方法?


-THE END-



如果觉得文章对你有帮助,欢迎转发、分享给朋友,感谢你的支持!


如果对本文有问题,欢迎留言!即使没有问题也可以留下走心评论。


如需转载请联系我。


微信公众号「鱼鹰谈单片机

每周一更单片机知识

长按后识别图中二维码关注