OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1887|回复: 6

软件定时器这个程序谁能给我讲一下如何实现的

[复制链接]

17

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-7-24
在线时间
107 小时
发表于 2018-8-15 09:51:57 | 显示全部楼层 |阅读模式
30金钱
软件定时器这个程序谁能给我讲一下如何实现的,用的是链表指针,实现了一个定时器转多路定时器的功能,但是代码看不太懂,有没有大神给解析一下。这是.c文件

[mw_shl_code=c,true]
#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++;
}

[/mw_shl_code]



这是.h文件
[mw_shl_code=c,true]/*
* 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);



#ifdef __cplusplus
}
#endif

#endif
[/mw_shl_code]


然后主函数

[mw_shl_code=applescript,true]#include "multi_timer.h"

struct Timer timer1;
struct Timer timer2;

void timer1_callback()
{
    printf("timer1 timeout!\r\n");
}

void timer2_callback()
{
    printf("timer2 timeout!\r\n");
}

int main()
{
        timer_init(&timer1, timer1_callback, 1000, 1000); //1s loop
        timer_start(&timer1);
       
        timer_init(&timer2, timer2_callback, 50, 0); //50ms delay
        timer_start(&timer2);
       
        while(1) {
            
            timer_loop();
        }
}

void HAL_SYSTICK_Callback(void)
{
    timer_ticks(); //1ms ticks
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-8-15 10:47:18 | 显示全部楼层
这个有啥不明白的,就是1ms定时器中断内查询定时任务是否需要执行而已
一分耕耘一分收获。
回复

使用道具 举报

17

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-7-24
在线时间
107 小时
 楼主| 发表于 2018-8-15 11:47:53 | 显示全部楼层
yklstudent 发表于 2018-8-15 10:47
这个有啥不明白的,就是1ms定时器中断内查询定时任务是否需要执行而已

链表是怎么执行的,能不能大概讲一下
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-8-15 12:47:16 | 显示全部楼层
fanhuayishi 发表于 2018-8-15 11:47
链表是怎么执行的,能不能大概讲一下

链表不明白,就去找本C语言书,把链表章节好好看看就明白了
一分耕耘一分收获。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-15 13:32:08 | 显示全部楼层
链表就相当于加了地址的结构体......找本c教程看看吧。时间久了忘了,,,现在都没人用链表了
猪猪熊呢?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-8-15 13:38:45 | 显示全部楼层
主要就是链表的插入与删除
一分耕耘一分收获。
回复

使用道具 举报

17

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-7-24
在线时间
107 小时
 楼主| 发表于 2018-8-20 14:51:41 | 显示全部楼层
yklstudent 发表于 2018-8-15 13:38
主要就是链表的插入与删除

看书也看不太懂,你要是明白的话能大概说说吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-28 03:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表