【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条回答
bad_fpga
2019-12-19 11:32
timer_init(&timer1, timer1_callback, 1000, 0); //1s delay

timer_init(&timer2, timer2_callback, 50, 50); //50ms loop

这个是不是可以这样理解
当repeat为0时,此时为延时函数,延时时间为timeout ms,比如第一个延时为1000ms

当repeat不为0时,此时为定时调用timer2_callback函数,调用时间为repeat ms,前面的timeout 与调用时间无关。
我自己试了,无论timeout 改为多少都没改变定时时间

一周热门 更多>