文档章节

单片机软件定时器

猎人嘻嘻哈哈的
 猎人嘻嘻哈哈的
发布于 06/22 19:28
字数 614
阅读 9
收藏 0
  • 之前写了一个软件定时器,发现不够优化,和友好,现在重写了
  • soft_timer.h
#ifndef _SOFT_TIMER_H_
#define _SOFT_TIMER_H_
#include "sys.h"


typedef void (*timer_callback_function)(void*);



typedef enum {
    TIMER_ENABLE,
    TIMER_DISABLE
}SoftTimerStatus;

typedef enum {
    TIMER_MALLOC_ERR=-1,
    TIMER_PRARM_ERR=-2,
    TIMER_OK=-3

}SoftTimerReturn;

typedef enum {
    /*立即调用一次*/
    IMMEDIATE_CALL_MODE,
    /*等待定时器时间到后调用*/
    WAIT_CALL_MODE
}SoftTimerMode;
typedef struct SOFT_TIMER{

    timer_callback_function timerFunc;
    SoftTimerStatus sTimerStatus;
    SoftTimerMode sTimeMode;
    u32 timerStartTime;
    u32 timerTime;
    u16 timerIndex;
    /*指向下一个定时器*/
    struct SOFT_TIMER* nextTimer;
    /*指向前一个定时器*/
    struct SOFT_TIMER* frontTimer;

}soft_Timer;
void soft_TimerInit(void);
SoftTimerReturn soft_TimerCreate(soft_Timer** timer,timer_callback_function fn,SoftTimerMode mode,SoftTimerStatus status,u32 time,u16 timer_index);
SoftTimerReturn soft_TimerDelete(soft_Timer* timer);
void soft_TimerTickUpdate(void);
void soft_TimerTask(void);
u32 soft_TimerTime(void);
void soft_TimerCmd(soft_Timer* timer,SoftTimerStatus status);
u16 soft_TimerNum(void);
void soft_TimerTest(void);


#endif // _SOFT_TIMER_H_

  • soft_timer.c
#include "soft_timer.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"

//#define NULL 0

u16 softTimerNum=0;
soft_Timer* TimerHead=NULL;
/*系统时间单位ms*/
u32 system_time=0;

void soft_TimerInit(void)
{
    soft_Timer* tempTimer=NULL;
		while(TimerHead!=NULL)
		{
				tempTimer=TimerHead;
				TimerHead=TimerHead->nextTimer;
				free(tempTimer);
				tempTimer=NULL;
		}
}
SoftTimerReturn soft_TimerCreate(soft_Timer** timer,timer_callback_function fn,SoftTimerMode mode,SoftTimerStatus status,u32 time,u16 timer_index)
{
	soft_Timer* tempTimer;
	
	tempTimer=TimerHead;
	/*为定时器分配空间*/
	TimerHead=(soft_Timer*)malloc(sizeof(soft_Timer));
	/*分配空间失败*/
  if(TimerHead==NULL)return TIMER_MALLOC_ERR;
	/*定时器模式*/
	TimerHead->sTimeMode=mode;
	/*定时器功能*/
	TimerHead->timerFunc=fn;
	/*定时器索引号*/
	TimerHead->timerIndex=timer_index;
	/*定时器时间*/
	TimerHead->timerTime=time;
	/*定时器状态*/
	TimerHead->sTimerStatus=status;
	/*下一个定时器*/
	TimerHead->nextTimer=tempTimer;
	/*前一个定时器*/	
	if(tempTimer!=NULL)
	tempTimer->frontTimer=TimerHead;
	/*前一个定时器*/

	TimerHead->frontTimer=NULL;
	/*定时器启动时间*/
	if(mode==IMMEDIATE_CALL_MODE)
			TimerHead->timerStartTime=system_time-time;
	else
			TimerHead->timerStartTime=system_time;
	/*定时器数*/
	softTimerNum++;
	/*返回定时器指针*/
	*timer=TimerHead;
	return TIMER_OK;
	
}

SoftTimerReturn soft_TimerDelete(soft_Timer* timer)
{	
		/*参数错误*/
    if(timer==NULL)return TIMER_PRARM_ERR;
		if(timer==TimerHead)
		{
			TimerHead=TimerHead->nextTimer;
			if(TimerHead!=NULL)
				TimerHead->frontTimer=NULL;
			free(timer);
			timer=NULL;
		}
		else
		{
			if(timer->nextTimer==NULL)
			{
				timer->frontTimer->nextTimer=NULL;
				free(timer);
				timer=NULL;
			}
			else
			{
				timer->frontTimer->nextTimer=timer->nextTimer;
				timer->nextTimer->frontTimer=timer->frontTimer;
				free(timer);
				timer=NULL;
			}
		}
    softTimerNum--;
    return TIMER_OK;
}
void soft_TimerTickUpdate(void)
{
    system_time++;
}
u16 soft_TimerNum(void)
{
    return softTimerNum;
}
void soft_TimerTask(void)
{
    soft_Timer* tempTimer;
    tempTimer=TimerHead;
    while(tempTimer!=NULL)
    {
        /*定时器使能状态*/
        if(tempTimer->sTimerStatus==TIMER_ENABLE)
        {
            /*计时是否达到*/
            if((system_time-tempTimer->timerStartTime)>=tempTimer->timerTime)
            {
                /*执行回调函数*/
                tempTimer->timerFunc(tempTimer);
                /*更新起始时间*/
                tempTimer->timerStartTime=system_time;
            }
        }
        tempTimer=tempTimer->nextTimer;
    }
}
u32 soft_TimerTime(void)
{
    return system_time;
}
void soft_TimerCmd(soft_Timer* timer,SoftTimerStatus status)
{
	timer->sTimerStatus=status;
}
void callfun(void* arg)
{
    static u32 cnt=0;
    soft_Timer* st;
    st=(soft_Timer*)arg;
//    printf("this is a soft timer test %d.\r\n",cnt++);
//    printf("timer index is %d\r\ntimer time is %d\r\n timer mode is %d\r\ntimer num is %d\r\n",st->timerIndex,st->timerTime,st->sTimeMode,soft_TimerNum());
}

void soft_TimerTest(void)
{
    soft_Timer* st;
		soft_Timer* st1;
	
    soft_TimerInit();

		soft_TimerCreate(&st,callfun,IMMEDIATE_CALL_MODE,TIMER_ENABLE,1000,4);
		soft_TimerCreate(&st1,callfun,IMMEDIATE_CALL_MODE,TIMER_ENABLE,1000,4);
		soft_TimerCreate(&st,callfun,IMMEDIATE_CALL_MODE,TIMER_ENABLE,1000,4);
	
		soft_TimerDelete(st1);
	
    while(1)
    {
			
        soft_TimerTickUpdate();
        soft_TimerTask();
			
    }
}


© 著作权归作者所有

共有 人打赏支持
上一篇: 字符串截取算法
下一篇: 消息队列
猎人嘻嘻哈哈的
粉丝 4
博文 8
码字总数 4150
作品 0
荆州
程序员
私信 提问
51单片机的中断和定时(全面)

定时器/计数器 51的定时器/计数器有2个分别是T1和T0,52系列的单片机有3个定时器/计数器,T0和T1是通用定时器/计数器,定时器/计数器2(简称T2)是集定时、计数和捕获三种功能于一体,功能更强...

yd401316240
04/18
0
0
嵌入式系统watchdog详解

嵌入式系统的工作常会受到外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以需要对嵌入式系统运行状态进行实...

songkai320
2017/12/25
0
0
C#上位机串口控制12864显示

实现的效果 上面是用Proteus仿真的,,对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分........... 为了程序一启动就把电脑上能用的串口号显示在下拉框...

杨奉武
2017/08/10
0
0
单片机C语言编程学习简介与第一个C语言程序

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/26
0
0
当单片机没有晶振?...

单片机到底是什么呢? 简单来说,它就是一个微型计算机系统。然而麻雀虽小,五脏俱全。单片机内部用到很多和电脑功能相类似的模块,像CPU、内存、并行总线、存储数据的存储器等在单片机中都存...

dp29sym41zygndvf
2017/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot中filter的用法

一、在spring的应用中我们存在两种过滤的用法,一种是拦截器、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。 二、f...

xiaomin0322
29分钟前
5
0
java项目修改了更换了jdk版本报错进行修改

java项目原来用的是1.8版本的,改成1.7版本后,项目会报错,要进行的修改是 然后是clean一下项目,然后是选中项目的buildpath,然后是configurebuildpath,然后是看jdk是否进行修改...

myAll_myAll
40分钟前
4
0
Gartner 2018 数据库系列报告发布 巨杉数据库连续两年入选

近期,Gartner陆续发布了2018年的数据库系列报告,包括《数据库魔力象限》《数据库核心能力》以及《数据库推荐报告》。其中,SequoiaDB巨杉数据库作为业界领先的金融级分布式交易型数据库产品...

巨杉数据库
43分钟前
2
0
Navicat闲置一段时间卡死问题的解决

先关闭连接,再右键点击所需要设置的链接,进入编辑连接,进入高级项,勾选保持连续间隔(秒):时间设置短一些,比如30秒,完成!!

joyStalker
43分钟前
3
0
理解Java中的弱引用(Weak Reference)

1. What——什么是弱引用? Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明: 弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回...

绝地逢生
44分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部