打印

对软定时器的一些思考

[复制链接]
1801|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
s17701332|  楼主 | 2016-10-16 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直想在单片机上实现一个像MFC和WPF一样的软定时器,前段时间看了《编程魔法师》以后自己花了点时间写了个,使用时需把timer_run函数放到定时器中断服务函数里面(设想中实时操作都是短时任务),本来已发到CSDN上的,想了想还是回来也给大家看下,看能不能再优化下

typedef struct _TIMER
{
        unsigned char isEnable;
        unsigned int  count;
        unsigned int  countNeed;
        void (*func)();       
}TIMER;



void timer_Run(TIMER *timer)
{
        if(timer.isEnable)
        {
                timer.count ++;
                if(timer.count == timer.countNeed)
                {
                        timer.count = 0;
                        timer.func();
                }
        }       
}

void startTimer(TIMER *timer)
{
        timer.count = 0;
        timer.isEnable = 1;
}

void stopTimer(TIMER *timer)
{
        timer.isEnable = 0;
        timer.count =0;
}

相关帖子

沙发
s17701332|  楼主 | 2016-10-16 17:01 | 只看该作者
发现个问题,上面的.需要换成->

使用特权

评论回复
板凳
s17701332|  楼主 | 2016-10-19 10:28 | 只看该作者
这个还是有点low了,需要在写中断的时候就要知道需要多少个定时器,需要经常维护,或许我们可以通过调用一个链表的方式实现

使用特权

评论回复
地板
21ndt| | 2016-10-25 11:27 | 只看该作者
跟这个做得很像
https://github.com/0x1abin/MultiTimer/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/

#include "multi_timer.h"

//timer handle list head.
static struct Timer* head_handle = NULL;

//Timer ticks
static uint32_t _timer_ticks = 0;

/**
  * @brief  Initializes the timer struct handle.
  * @param  handle: the timer handle strcut.
  * @param  timeout_cb: timeout callback.
  * @param  repeat: repeat interval time.
  * @retval None
  */
void timer_init(struct Timer* handle, void(*timeout_cb)(), uint32_t timeout, uint32_t repeat)
{
        // memset(handle, sizeof(struct Timer), 0);
        handle->timeout_cb = timeout_cb;
        handle->timeout = _timer_ticks + timeout;
        handle->repeat = repeat;
}

/**
  * @brief  Start the timer work, add the handle into work list.
  * @param  btn: target handle strcut.
  * @retval 0: succeed. -1: already exist.
  */
int timer_start(struct Timer* handle)
{
        struct Timer* target = head_handle;
        while(target)
        {
                if(target == handle) return -1;        //already exist.
                target = target->next;
        }
        handle->next = head_handle;
        head_handle = handle;
        return 0;
}

/**
  * @brief  Stop the timer work, remove the handle off work list.
  * @param  handle: target handle strcut.
  * @retval None
  */
void timer_stop(struct Timer* handle)
{
        struct Timer** curr;
        for(curr = &head_handle; *curr; )
        {
                struct Timer* entry = *curr;
                if (entry == handle)
                {
                        *curr = entry->next;
//                        free(entry);
                }
                else
                        curr = &entry->next;
        }
}

/**
  * @brief  main loop.
  * @param  None.
  * @retval None
  */
void timer_loop()
{
        struct Timer* target;
        for(target=head_handle; target; target=target->next)
        {
                if(_timer_ticks >= target->timeout)
                {
                        if(target->repeat == 0)
                        {
                                timer_stop(target);
                        }
                        else
                        {
                                target->timeout = _timer_ticks + target->repeat;
                        }
                        target->timeout_cb();
                }
        }
}

/**
  * @brief  background ticks, timer repeat invoking interval 1ms.
  * @param  None.
  * @retval None.
  */
void timer_ticks()
{
        _timer_ticks++;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/

#ifndef _MULTI_TIMER_H_
#define _MULTI_TIMER_H_

#include "stdint.h"

typedef struct Timer {
    uint32_t timeout;
    uint32_t repeat;
    void (*timeout_cb)(void);
    struct Timer* next;
}Timer;

#ifdef __cplusplus  
extern "C" {  
#endif  

void timer_init(struct Timer* handle, void(*timeout_cb)(), uint32_t timeout, uint32_t repeat);
int  timer_start(struct Timer* handle);
void timer_stop(struct Timer* handle);
void timer_ticks(void);
void timer_loop(void);

// void timer_again(struct Timer* handle);
// void timer_set_repeat(struct Timer* handle, uint32_t repeat);

#ifdef __cplusplus
}
#endif

#endif


使用特权

评论回复
5
s17701332|  楼主 | 2016-10-25 14:03 | 只看该作者
21ndt 发表于 2016-10-25 11:27
跟这个做得很像
https://github.com/0x1abin/MultiTimer/*
* Copyright (c) 2016 Zibin Zheng

用链表实现可以更好的重复利用,看来有人和我想法一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

31

帖子

1

粉丝