0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

接触到的定时器设计中,非常精妙非阻塞延时程序

2oON_changxuemc 来源:互联网 作者:佚名 2018-01-17 08:42 次阅读

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

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

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

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

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

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

在上篇文章中有对systick的介绍,比如我要设置其10ms中断一次,如何实现呢?

也很简单,只需调用core_cm3.h文件中 SysTick_Config函数 ,当系统时钟为72MHZ,则设置成如下即可SysTick_Config(720000); (递减计数720000次后中断一次) 。此时SysTick_Handler中断函数就会10ms进入一次;

任务定时用软件是如何设计的呢 ?

且先看其数据结构,这也是精妙所在之处,在此作自顶向下的介绍:

其定义结构体类型如:

其中Char_Field 为一联合体,设计如下:

而它内部的Timer_Bit是一个可按位访问的结构体:

此联合体的这样设计的目的将在后面的代码中体现出来。

如此结构体的设计就完成了。

然后我们定义的一全局变量,Timer_Struct gTimer;

并在头文件中宏定义如下:

另外为了后面程序清晰,再定义一状态指示:

至此,准备工作就完成了。下面我们就开始大显神通了!

首先,10ms定时中断处理函数如,可以看出,每到达10ms 将把bTemp10Msec置1,每50ms 将把bTemp50Msec置1,每100ms 将把bTemp100Msec置1,每1s 将把bTemp1Sec置1,

而这又有什么用呢 ?

这时,我们需在主轮询while(1)内最开始调用一个定时处理函数如下:

此函数开头与结尾两句:

就分别巧妙的实现了bSystemXXX (低4位) 和 bTempXXX(高4位)的清零工作,不用再等定时到达后还需手动把计数值清零。此处清零工作用到了联合体中的变量共用一个起始存储空间的特性。

但要保证while(1)轮询时间要远小于10ms,否则将导致定时延时不准确。这样,在每轮询一次,就先把bSystemXXX ,再根据bTempXXX判断是否时间到达,并把对应的bSystemXXX 置1,而后面所有的任务就都可以通过bSystemXXX来进行定时延时,在最后函数退出时,又会把bTempXXX清零,为下一次时间到达后查询判断作好了准备。

说了这么多,举例说明一下如何应用:

以上示例四个任务进程,

在主轮询里可进行如下处理:

这样,就可以轻松且清晰实现了多个任务,不同时间内处理不同事件。(但注意,每个任务处理中不要有阻塞延时,也不要处理过多的事情,以致处理时间较长。可设计成状态机来处理不同任务。)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23100

    浏览量

    657801
  • 定时器
    +关注

    关注

    23

    文章

    3236

    浏览量

    114396
  • 跑马灯
    +关注

    关注

    5

    文章

    117

    浏览量

    34746

原文标题:精妙的单片机非阻塞延时程序设计

文章出处:【微信号:changxuemcu,微信公众号:畅学单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    proteus电压电流探针怎么用?刚接触到,请大家帮忙告知。

    proteus电压电流探针怎么用?刚接触到,请大家帮忙告知。希望能说的明白一点,谢谢。
    发表于 03-07 15:15

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

    我们接触到定时器,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断一次,让灯亮或灭,其余的时间系统还可以做非常之多的事情,效率一下提升了很多。这时我们就会慢慢意识到,
    发表于 05-23 15:23

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

    (500); LED = ON; Delay_ms(500);}然后,在我们接触到定时器,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断一次,让灯亮或灭,其余的时间系统还可以做
    发表于 07-09 15:12

    fpga基础篇(一):阻塞阻塞赋值

    ,被赋值对象会比赋值对象差一个时钟周期。有了上述理解之后,我们就很容易明白为什么阻塞赋值的对象会立即发生改变,在fpga我们多接触到的是时序电路,并不希望被赋值对象立即改变,所以有对于组合电路而言
    发表于 04-05 09:53

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

    (500); LED = ON; Delay_ms(500);}然后,在我们接触到定时器,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断一次,让灯亮或灭,其余的时间系统还可以做
    发表于 03-26 16:53

    STM32定时器的使用学习

    从点亮LED灯开始的入坑之路建议点完灯之后立即学习怎么使用小屏幕OLED(几个脚都好用)接下来可以开始串口通信的学习(尤其是收发中断)ADC的使用非常重要很多接触到的传感都是输出模拟量的而且需要
    发表于 01-06 07:48

    PIC32系列参考手册之看门狗定时器程序监控定时器和上电延时定时器

    本文主要介绍了PIC32系列参考手册之看门狗定时器程序监控定时器和上电延时定时器
    发表于 06-06 17:29 15次下载

    定时器延时控制电机驱动程序下载

    定时器延时控制电机驱动程序下载
    发表于 04-01 16:46 21次下载
    <b class='flag-5'>定时器</b><b class='flag-5'>延时</b>控制电机驱动<b class='flag-5'>程序</b>下载

    基于硬件定时器的软件定时器

    概括硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源。梳理讲到定时器,大家多多少少
    发表于 11-25 09:51 8次下载
    基于硬件<b class='flag-5'>定时器</b>的软件<b class='flag-5'>定时器</b>

    STM32定时器US延时

    定时器”介绍的SysTick定时器,该定时器位于Cortex-M3内核。外设定时器由芯片半导体厂商设计,如STM32系列,包含常规
    发表于 12-05 15:36 25次下载
    STM32<b class='flag-5'>定时器</b>US<b class='flag-5'>延时</b>

    使用555定时器实现延时关灯

    使用555定时器实现延时关灯
    发表于 11-21 14:54 11次下载

    接触式洗手定时器

    电子发烧友网站提供《接触式洗手定时器.zip》资料免费下载
    发表于 11-30 11:22 0次下载
    <b class='flag-5'>非</b><b class='flag-5'>接触</b>式洗手<b class='flag-5'>定时器</b>

    COVID-19接触式洗手定时器

    电子发烧友网站提供《COVID-19接触式洗手定时器.zip》资料免费下载
    发表于 12-16 14:36 0次下载
    COVID-19<b class='flag-5'>非</b><b class='flag-5'>接触</b>式洗手<b class='flag-5'>定时器</b>

    电工知识—SIMATIC S7-1500 PLC定时器—断开延时定时器

    断开延时定时器(SF)相当于继电器控制系统的断电延时时间继电器,是定时器指令唯一一个由下降沿启动的定时
    的头像 发表于 04-21 09:06 8874次阅读

    定时器阻塞线程吗 定时器指令有哪几种

    定时器阻塞线程吗 定时器指令有哪几种  定时器一般不会阻塞线程,但具体是否会阻塞取决于所使用的
    的头像 发表于 12-19 14:03 876次阅读