文档章节

单片机软件定时器

猎人嘻嘻哈哈的
 猎人嘻嘻哈哈的
发布于 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

没有更多内容

加载失败,请刷新页面

加载更多

【挑战剑指offer】系列03:逆序打印单链表

本系列的算法原题来自于“牛客网-剑指offer”,写这个板块,不仅仅是解决算法问题本身,更是手动提高难度、自行变式,思考更多的解决方案,以带给自己一些启发。 1. 【逆序打印单链表】原始题...

LinkedBear
22分钟前
1
0
Linux内存布局

今天这篇文章主要是我之前看Linux内核相关知识和博客Gustavo Duarte中。我主要是看了这篇博客,并且结合之前的知识,对内存管理的的理解又上升了一个档次。所以想通过这篇文章总结下。 我们先...

linuxprobe16
40分钟前
1
0
day94-20180921-英语流利阅读-待学习

记录死亡还是消费死者?自杀报道的媒体偏见 雪梨 2018-09-21 1.今日导读 自杀事件报道一直是新闻报道的重要部分,具有骇人听闻、吸引眼球的特点。可是在报道这些事件的时候,除了客观陈述事实...

飞鱼说编程
47分钟前
3
0
如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部