找回密码
 注册
查看: 671|回复: 9
打印 上一主题 下一主题

精妙的单片机非阻塞延时程序设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-25 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
精妙的单片机非阻塞延时程序设计. a2 M" Z8 |  F. M9 H
% a* {+ C8 k: s' D$ U7 o( |

" s& \5 U" m$ Z$ W5 X5 M

对于每个单片机爱好者及工程开发设计人员,在刚接触单片机的那最初的青葱岁月里,都有过点亮跑马灯的经历。从看到那一排排小灯按着我们的想法在跳动时激动心情。到随着经验越多,越来又会感觉到这个小灯是个好东西,尤其是在调试资源有限的环境中,有时会帮上大忙。

但对于绝大多数人,我们在最最初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子:

  • while(1)
    / w  e, }5 _. H& o
  • {
  •     LED =OFF;
  •     Delay_ms(500);
  •     LED = ON;
  •     Delay_ms(500);
  • }( _& b3 H) M2 \

然后,在我们接触到定时器,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断一次,让灯亮或灭,其余的时间系统还可以做非常之多的事情,效率一下提升了很多。

这时我们就会慢慢意识到,第一种(阻塞延时)方法效率很低,让芯片在那儿空运行几百毫米,什么也不做,真是莫大的浪费,尤其在芯片频率较高,任务又很多时,这样做就像在平坦宽阔的高速公路上挖了一大坑,出现事故可想而知。

但一个单片机中的定时器毕竟有限,如果我需要几十个或者更多不同时间的定时中断,每一个时间到都完成不同的处理动作,如何去做呢。一般我们会想到在一个定时中断函数中再定义static 变量继续定时,到了所需时间,做不同的动作。而这样又会导致在一个中断里做了很多不同的事情,会抢占主轮询更多时间,有时甚至喧宾夺主,并也不是很如的思维逻辑。

那么有没有更好的方法来实现呢,答案是肯定的。下面介绍我在一个项目中偶遇,一个精妙设计的非阻塞定时延时软件的设计(此设计主要针对于无操作系统的裸机程序)。

游客,如果您要查看本帖隐藏内容请回复


7 d; I/ `. b5 ^& S, Q

该用户从未签到

3#
发表于 2019-2-25 18:07 | 只看该作者
一直想了解下,非系统状态下的精准时间
* Q) R, o: S) J5 N7 c

该用户从未签到

4#
发表于 2019-10-14 22:42 | 只看该作者
aaaaaaaaaaaaaaaaaaa

该用户从未签到

5#
发表于 2019-10-21 16:38 | 只看该作者
学习一下,可以让自己更好

该用户从未签到

6#
发表于 2019-11-7 16:45 | 只看该作者
0 T; P1 `, S+ `0 ?& g. e, w# A! `
谢谢楼主分享,看看...........
  • TA的每日心情
    开心
    2025-5-7 15:57
  • 签到天数: 238 天

    [LV.7]常住居民III

    8#
    发表于 2021-8-31 16:36 | 只看该作者
    好的思路决定一个好的东东
    / y# S0 l6 f0 H% Q

    该用户从未签到

    9#
    发表于 2021-10-9 23:50 | 只看该作者
    aaaaaaaaaaaaaaa
    4 H% O9 v, Z1 r4 A  J5 _9 @
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-5-10 12:56 , Processed in 0.093750 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表