文档章节

单片机软件定时器

猎人嘻嘻哈哈的
 猎人嘻嘻哈哈的
发布于 06/22 19:28
字数 614
阅读 9
收藏 0
点赞 0
评论 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
码字总数 4074
作品 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
arduino的自带延时函数的陷阱

新手刚接触arduino,在今天玩温湿度传感器(AM2302)时,发现网上的程序中有一个名为micros()的函数不知是干什么用的,然后就在网上搜了搜: micros()是一个用了arduino的中断timer0写的函...

wodeyuxuan
2015/08/01
0
0
Arduino、arm、树莓派、单片机四者有什么不同?

1 . Arduino Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。它适用于爱好者、艺术家、设计师和对于“互动”有兴趣的朋友们。(...

孟浩奇
2016/02/25
54
0
nodemcu定时器tmr代替while

一开始接触ESP8266时,选择了看安可信的开发文档,名字叫做ESP8266 SDk 编程手册,可惜研究了挺久的,还是没怎么整明白,差点就放弃了ESP8266的学习,后来尝试这用AT指令去做了些东西,虽然实...

qq_30907913
04/20
0
0
Android系统层Watchdog机制源码分析

一:为什么需要看门狗? Watchdog,初次见到这个词语是在大学的单片机书上, 谈到了看门狗定时器. 在很早以前那个单片机刚发展的时候, 单片机容易受到外界工作影响, 导致自己的程序跑飞, 因此有...

Anderson大码渣
2017/12/21
0
0
[自娱自乐] 3、超声波测距模块DIY笔记(三)

前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射...

史迪奇2号
2017/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
38分钟前
0
0
从MySQL全备文件中恢复单个库或者单个表

从MySQL全备文件中恢复单个库或者单个表 提取建库语句 sed -n '/^-- Current Database: db_cms/,/^-- Current Database: `/p' backup.sql > db_cms.sql & 提取ddl sed -e'/./{H;$!d;}' -e ......

yysue
今天
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部