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

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

3天内不再提示

关于软件定时器的一些讨论

麦克泰技术 来源:麦克泰技术 2023-10-13 16:14 次阅读
简介 这里先介绍下软件定时器硬件定时器的区别硬件定时器

CPU内部自带的定时器模块,通过初始化、配置可以实现定时,定时时间到以后就会执行相应的定时器中断处理函数。硬件定时器一般都带有其它功能,比如PWM输出、输入捕获等等功能。但是缺点是硬件定时器数量少!!

软件定时器

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。FreeRTOS中有专门的软件定时器功能,我们可以在MCU中简单的是实现“软件定时器”如下:
void timer_1000ms(void)
{
  printf("timer_1000ms
");
}
/*systick_ms在硬件定时器中每1ms加1*/
int main(void)
{
  static timer_tick = 0;
  timer_tick = systick_ms;
  while()
  {
    if((systick_ms-timer_tick)>1000)
    {
      timer_tick = systick_ms;
      timer_1000ms();
    }
  }
}
这就是简单的软件定时器,是的,这就是特别简洁版本的软件定时器。当然它是有缺点的,比如systick_ms每1ms加1,所以软件定时器的精度是ms为单位的,并且如果while(1)中有其他代码阻塞,软件定时器也会跟着阻塞的。这个简单的软件定时器毕竟很"简陋",大家可以自行封装丰富一下,或者参考已经有的开源方案:MultiTimer,一款可无限扩展的软件定时器。MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。开源地址:https://github.com/0x1abin/MultiTimer MultiTimer MultiTimer的设计比较简洁,只有2个文件,并且只有4个函数,总共82行代码,稍微花一点功夫就可以理解明白。

a265e5ba-699e-11ee-939d-92fbcf53809c.png

移植步骤

  • 配置系统时间基准接口,安装定时器驱动

uint64_t PlatformTicksGetFunc(void)
{
    /* Platform implementation */
}
MultiTimerInstall(PlatformTicksGetFunc);
  • 实例化一个定时器对象

MultiTimer timer1;
  • 设置定时时间,超时回调处理函数, 用户上下指针,启动定时器

int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData);
  • 在主循环调用定时器后台处理函数

int main(int argc, char *argv[])
{
    ...
    while (1) {
        ...
        MultiTimerYield();
    }
}

具体就不做手把手教程如何移植了,在STM32F207移植好的工程开源地址:

开源地址:https://github.com/strongercjd/STM32F207VCT6/tree/master/23-Timer-MultiTimer

下面分析一下MultiTimer在移植的第一步,配置系统时间基准接口,安装定时器驱动
uint64_t PlatformTicksGetFunc(void)
{
    /* Platform implementation */
}
MultiTimerInstall(PlatformTicksGetFunc);
看一下MultiTimerInstall函数原型
typedef uint64_t (*PlatformTicksFunction_t)(void);
static PlatformTicksFunction_t platformTicksFunction = NULL;
int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
{
    platformTicksFunction = ticksFunc;
    return 0;
}
这其实就是函数指针实现的回调函数,具体详解看之前的文章《回调函数》,其实就是给MultiTimer提供一个计数器。除去回调函数,该开源项目还是单链表的很好的示例,学习数据结构是比较乏味的,这个开源项目是单链表很好的应用落地,不太懂的同学可以学习下。下面摘取一下部分代码链表的删除
for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
  if (timer == *nextTimer) {
    *nextTimer = timer->next; /* remove from list */
    break;
  }
}

插入链表

for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) {
  if (!*nextTimer) {
    timer->next = NULL;
    *nextTimer = timer;
    break;
  }
  if (timer->deadline < (*nextTimer)->deadline) {
    timer->next = *nextTimer;
    *nextTimer = timer;
    break;
  }
}

遍历链表

MultiTimer* entry = timerList;
for (; entry; entry = entry->next) {
  /* Sorted list, just process with the front part. */
  if (platformTicksFunction() < entry->deadline) {
    return (int)(entry->deadline - platformTicksFunction());
  }
  /* remove expired timer from list */
  timerList = entry->next;


  /* call callback */
  if (entry->callback) {
    entry->callback(entry, entry->userData);
  }
}
这篇文章不会详细讲解链表的操作,不懂的同学可以看之前文章《链表在STM32中的应用》。

当然MultiTimer也是有缺点的,比如一个定时器是1000ms,另一个定时器是500ms,调度时就会冲突,也没有定时器调度抢占,会随着其他代码的阻塞而阻塞。这种类似的问题不再详述,大家使用的时候多测测就好。

任务调度

看了上面的操作,如果我们不叫软件定时器,叫它“任务”,是不是和FreeRTOS任务类似,感觉高端一些,甚至这篇文章标题可以修改为《一篇文章教你实现操作系统,开个欢笑,不做标题党。

有些项目实时性要求高,需要任务抢占,所以需要使用FreeRTOS这样的操作系统,但它资源占用比例过大,不利于项目开发,在一般的小项目中也用不到RTOS的太多功能,使用上面的思路,你可以把每个任务设置不同的间隔时间周期性调用,如果有实时性要求很高的事件,就通过中断处理。

当然也可以使用开头的粗糙方法

if((systick_ms-timer_tick)>1000)
{
   timer_tick = systick_ms;
   timer_1000ms();
}

这样功能是可以实现的,但没有模块化,不利于代码的维护。我们可以借鉴MultiTimer思路封装一下软件接口。

并且,如果你的项目中,任务的个数是固定不变的,可以将MultiTimer中的链表拿掉,直接使用全局变量就可以,如果有额外的时间模仿FreeRTOS实现一些信号量,对列等,这就是自己的OS(无抢占)啊。(当然这属于重复造轮子,但对一些公司来讲,有适合自己业务的,最精简的代码框架是很有必要的)。


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

    关注

    114

    文章

    5109

    浏览量

    213051
  • 定时器
    +关注

    关注

    23

    文章

    3228

    浏览量

    114259
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62291

原文标题:关于软件定时器的一些讨论

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于STM32的软件定时器设计

    软件定时器是用程序模拟出来的定时器,可以由个硬件定时器模拟出成千上万个软件
    发表于 07-03 17:06 968次阅读
    基于STM32的<b class='flag-5'>软件</b><b class='flag-5'>定时器</b>设计

    555定时器电路原理图 基于555芯片的定时器电路设计

    这节要将的是关于555芯片组成的定时器电路,主要讲解6种,分别是延时定时器、长延时定时器、分段式定时器、抗干扰的
    发表于 07-18 17:40 1.7w次阅读
    555<b class='flag-5'>定时器</b>电路原理图 基于555芯片的<b class='flag-5'>定时器</b>电路设计

    定时器一些使用案例

    本片文章包含了定时器一些使用,包括下面五个实验:1.测量信号的脉宽2.PWM 输出3.PWM 互补输出4.PWM 输入5.电容按键检测
    发表于 08-16 07:00

    单片机的定时器中断讨论

    外部的脉冲信号(P3.4,P3.5两个外部中断输入引脚)对寄存的数据+14.有了定时器/计数后可以增加单片机的效率,一些简单重复的+1工作可以交给
    发表于 12-08 08:29

    555定时器应用设计软件免费下载

    本文档的主要内容详细介绍的是555定时器应用设计软件免费下载,本软件款555定时器设计软件
    发表于 12-17 08:00 51次下载
    555<b class='flag-5'>定时器</b>应用设计<b class='flag-5'>软件</b>免费下载

    设计软件定时器

    在MCU芯片内部,往往硬件定时器的数量是非常有限的,而实际工程中却需要大量的定时器来辅助完成具体的功能,如果个函数占用定时器,那么显然
    发表于 11-05 18:35 2次下载
    设计<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><b class='flag-5'>定时器</b>

    STM32开发项目:软件虚拟定时器的实现

    目录背景软件定时器库特性源码介绍softwaretimer.csoftwaretimer.h使用指南背景在不运行实时操作系统的单片机中,面对一些复杂的项目需求时,仅有的几个硬件定时器
    发表于 12-24 19:15 1次下载
    STM32开发项目:<b class='flag-5'>软件</b>虚拟<b class='flag-5'>定时器</b>的实现

    使用555定时器来制作一些乐器

    电子发烧友网站提供《使用555定时器来制作一些乐器.zip》资料免费下载
    发表于 11-16 09:56 1次下载
    使用555<b class='flag-5'>定时器</b>来制作<b class='flag-5'>一些</b>乐器

    软件定时器简介及程序配置

      软件定时器就是允许函数设置定的等待时间,然后执行。定时器执行的函数被称为定时器的回调函数。定时器
    的头像 发表于 12-06 16:10 3801次阅读
    <b class='flag-5'>软件</b><b class='flag-5'>定时器</b>简介及程序配置

    单片机软件定时器的实现方法

    定时器个数般都比较少,在一些有多个周期性操作的应用场合就无法满足要求。这时,就可以基于硬件定时器派生出软件
    的头像 发表于 01-17 15:14 4602次阅读
    单片机<b class='flag-5'>软件</b><b class='flag-5'>定时器</b>的实现方法

    freeRTOS软件定时器的使用

    freeRTOS中加入了软件定时器这个功能组件,是个可选的、不属于freeRTOS内核的功能,由定时器服务(其实就是
    的头像 发表于 02-10 13:55 1981次阅读

    Free RTOS的软件定时器

    软件定时器是FreeRTOS中的个重要模块,使用软件定时器可以方便的实现一些与超时或周期性相关
    的头像 发表于 02-10 15:53 2249次阅读
    Free RTOS的<b class='flag-5'>软件</b><b class='flag-5'>定时器</b>

    什么是软件定时器软件定时器的实现原理

    软件定时器是用程序模拟出来的定时器,可以由个硬件定时器模拟出成千上万个软件
    的头像 发表于 05-23 17:05 2625次阅读

    如何实现软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过个硬件定时器产生固定的时钟节拍,每次硬件
    的头像 发表于 04-29 11:00 545次阅读