linux定义多个定时器,timer: 一个Linux下的超级精简的多重定时器

MT_Timer(MT译为Multiple或Multi)

介绍

一个Linux下的超级简洁的定时器:利用epoll机制和timerfd新特性实现的多重、多用、多个定时器实现。只需要使用TIMER_CREATE()接口创建一个定时器实体,即可向其添加成千上万个定时任务,定时任务可达到纳秒级别的精度,且可在同一时间点添加不同的定时任务!。

软件接口

整个定时器包含如下几类接口。

创建和声明定时器实例:使用定时器的第一步就是使用TIMER_CREATE()创建一个定时器实例,在其它文件使用到该定时器时,使用TIMER_DECLEAR()进行声明:

TIMER_CREATE(name);

TIMER_DECLEAR(name);

初始化和反初始化定时器:在正式使用定时器之前,首先使用TIMER_INIT()初始化前面创建的定时器实例,name是实例名称,max是创建定时器要检测的定时任务数量;当不再使用定时器时,可使用TIMER_DEINIT()反初始化定时器(退出定时器,并释放所有资源):

TIMER_INIT(name, max);

TIMER_DEINIT(name);

添加和删除定时任务:

TIMER_ADD(name, itimespec, repeat, cb, data);

TIMER_DEL(name, timerfd);

TIMER_ADD()用于向定时器实例name中添加一个定时器,其参数描述如下:

ittimespec是定时器的定时时间和循环事件,其结构体类型如下:

struct timespec {

time_t tv_sec; // seconds

long tv_nsec; // nanoseconds

};

struct itimerspec {

struct timespec it_value;

struct timespec it_interval;

};

其中it_value即是超时时间,若想定义周期定时任务,则设置it_interval成员;若不想定义周期定时器,则需设置it_interval成员都为0。因此,第一次超时和后面周期定时任务是可以使用不同时间的。

repeat是周期定时器的重复次数,若设置为**-1,代表永远重复;0,代表一次都不执行**;因此repeat应至少为1,或者使用-1;

cb为定时任务超时回调函数,其类型为:void (*timer_callback_t)(void *data);

data为定时任务回调函数的参数,为void *类型,用户可指定为自己定义的结构体;

TIMER_ADD()添加定时任务成功返回新定时任务的文件描述符,失败返回 < 0。返回的文件描述符,可用于在TIMER_DEL()中删除定时器。

查询和清空定时器

TIMER_COUNT(name);

TIMER_CLEAR(name);

TIMER_COUNT(name)用于查询定时器实例name中现存的定时任务个数;TIMER_CLEAR(name)用于清空定时器实例name中的所有定时任务。

使用实例

下面是一个非常简单的使用示例:共创建了两个定时器,每个第一次超时都是3S,后面每隔1S超时一次;但第一个定时器频次为8,第二个定时器频次为3;当所有定时器都超时后,输入回车即可退出:

#include

#include

#include

#include "mt_timer.h"

void timeout_handle(void *arg)

{

printf("[%ld]:timeout1\n", time(NULL));

}

void timeout_handler(void *arg)

{

printf("[%ld]:timeout2\n", time(NULL));

}

TIMER_CREATE(test);

int main(void)

{

int timer;

struct itimerspec itimespec;

TIMER_INIT(test, 10);

itimespec.it_value.tv_sec = 3;

itimespec.it_value.tv_nsec = 0;

itimespec.it_interval.tv_sec = 1;

itimespec.it_interval.tv_nsec = 0;

timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL);

TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL);

printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));

sleep(4);//getchar();

TIMER_DEL(test, timer);

printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));

TIMER_CLEAR(test);

printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));

getchar();

TIMER_DEINIT(test);

return 0;

}

参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md

GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于单片机的电子日历设计 一、设计目的和要求 单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞 机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制 和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单 片机。单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智 能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。 这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 通过对一个基于单片机的能实现电子日历功能电子时钟的设计,从而达到学习、了解单 片机相关指令在各方面的应用。系统由主控制器AT89C51、时钟电路DS1302、显示电路、 和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。 系统设计要求:电子日历能显示,能调整。基于51系列的单片机进行的电子万年历设 计可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片 机的理论基础和外围扩展知识进行了比较全面准备。具体实现功能:显示年月日时分秒 及星期信息,具有可调整日期和时间功能,与即时时间同步。 主要使用到的工具和器件: Keilc51 Protues DS1302 AT89S52 LCD12864 二、方案设计 每一系统都有几个核心的模块。它对整个系统的性能有非常大的影响。比如 系统的主控。 2.1 主控芯片选择方案论证 方案一:选择51系列的单片机;AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器 。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的 解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一 个中断或硬件复位为止。 方案二:选择msp430系列单片机;MSP430系列单片机是一个16位的单片机,采用了精简 指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算 ;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。MSP430 系列单片机的各系列都集成了较丰富的片内外设。它们分别是看门狗(WDT)、模拟比较 器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、 SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-Δ ADC、DMA、I/O端口、基本定时器(Basic Timer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。其中,看门狗可以 使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D 转换器;16 位定时器Timer_A 和 Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、 PWM等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通 信等应用;具有较多的 I/O 端口,P0、P1、P2 端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件 A/D 转换器有较高的转换速率,最高可达200kbps ,能够满足大多数数据采集应用;能直接驱动液晶多达 160 段;实现两路的 12 位D/A转换;硬件I2C串行总线接口实现存储器串行扩展;以及为了增加数据传输速度, 而采用的DMA模块。MSP430 系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。 方案对比: 运算周期:时钟显示最小单位为秒,51和msp430的运算周期都在1秒之内,这一点 都满足要求。 IO口是否满足系统设计要求:51有32个IO口,msp430的IO口则更多。这一点都满足 要求。 是否需要外加时钟芯片:采用定时器,误差较大。Msp430内部就有时钟RTC单元, 5
之前分享过STM32、Arduino、K60的资料包,今天给大家分享MSP430入门资料。MSP430的资料在老早之前已经整理了,但是不知道需求大不大,最近看到好多同学在问MSP430,所以现在分享出来,给入门者一个参考。 MSP430系列单片机是TI1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器,将多个不同功能的模拟电路、数字电路和微处理器集成在一个芯片上,以提供”单片机“解决方案,多用于需要电池供电的便携式仪器仪表中。 片内资源丰富(此段来自百度百科,熟知的可以自行跳过) MSP430 系列单片机的各系列都集成了较丰富的片内外设。它们分别是看门狗(WDT)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-Δ ADC、DMA、I/O端口、基本定时器(Basic Timer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D 转换器;16 位定时器Timer_A 和 Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、PWM等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的 I/O 端口,P0、P1、P2 端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件 A/D 转换器有较高的转换速率,最高可达200kbps ,能够满足大多数数据采集应用;能直接驱动液晶多达 160 段;实现两路的 12 位D/A转换;硬件I2C串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用的DMA模块。MSP430 系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。 看看附件里都有什么吧。
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值