【MultiTimer】简易小巧的软件定时器扩展模块

2019-12-13 18:31发布

本帖最后由 半导体 于 2016-9-23 22:44 编辑

简介:
        前几天在坛里分享的MultiButton按键模块看到大家对此感兴趣,这让我备受鼓舞!今天分享的是一个简易的软件定时器模块,跟MultiButton一样使用单向链表串连管理同样的套路。
        这种类似的软件定时器模块其实在很多SOC的SDK上都已经有自带的API接口了,但很多工程师在裸机上开发还是习惯使用判断定时变量计数或标志位的方式去传递执行一些定时任务,
        虽然这种方式简单高效,但随着工程增大会出现满天飞的定时全局变量和标志位,加大了各代码段之间的耦合程度,并且很不优雅。
        MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。

使用方法:
        1.先申请一个定时器管理handle:
                struct Timer timer1;

        2.初始化定时器对象,注册定时器回调处理函数,设置定时时间(ms),循环定时触发时间:
                timer_init(struct Timer* handle, void(*timeout_cb)(), uint32_t timeout, uint32_t repeat);

        3.启动定时器
                timer_start(&timer1);

        4.设置1ms的硬件定时器循环调用 timer_ticks() 以提供时间基准
                void HAL_SYSTICK_Callback(void)
                {
                        timer_ticks();
                }

        5.在主循环调用定时器后台处理函数
                int main()
                {
                            while(1) {
                                ...
                                timer_loop();
                            }
                }

例程:
  1. #include "multi_timer.h"

  2. struct Timer timer1;
  3. struct Timer timer2;

  4. void timer1_callback()
  5. {
  6.     printf("timer1 timeout! ");
  7. }

  8. void timer2_callback()
  9. {
  10.     printf("timer2 timeout! ");
  11. }

  12. int main()
  13. {
  14.         timer_init(&timer1, timer1_callback, 1000, 0); //1s delay
  15.         timer_start(&timer1);
  16.        
  17.         timer_init(&timer2, timer2_callback, 50, 50); //50ms loop
  18.         timer_start(&timer2);
  19.        
  20.         while(1) {
  21.             
  22.             timer_loop();
  23.         }
  24. }

  25. void HAL_SYSTICK_Callback(void)
  26. {
  27.     timer_ticks(); //1ms ticks
  28. }
复制代码

模块下载地址:
https://github.com/0x1abin/MultiTimer
(注:使用github的原因是我后面的一些改动能够及时更新,附件没法及时更新)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
77条回答
磊磊映画
2019-12-16 05:56
半导体 发表于 2016-9-24 16:21
检测定时器超时和执行定时器回调啊

去github看了下源代码
  1. /**
  2.   * @brief  main loop.
  3.   * @param  None.
  4.   * @retval None
  5.   */
  6. void timer_loop()
  7. {
  8.         struct Timer* target;
  9.         for(target=head_handle; target; target=target->next) {
  10.                 if(_timer_ticks >= target->timeout) {
  11.                         if(target->repeat == 0) {
  12.                                 timer_stop(target);
  13.                         } else {
  14.                                 target->timeout = _timer_ticks + target->repeat;
  15.                         }
  16.                         target->timeout_cb();
  17.                 }
  18.         }
  19. }
复制代码就明白了
楼主的定时器模块很灵活
1.可以实现程序延时
2.又可以实现定时
3.用一个硬件systick,模拟出了多个软件定时器,很节约资源
缺点:就是定时有一定的误差,不过一般应用还是可以满足的。


一周热门 更多>