当前位置:首页 > 旅游指南

定时器软件 完全由C编写,高度可移植,超级牛逼的软件定时器!

作为一个电子嵌入式的人,相信定时器永远不会陌生。看STM32的官方数据手册,可能有四分之一的空间是用来放定时器的,可见定时器的重要性。计时器,最重要的功能是计时。之前弟弟经常跟我抱怨,唉,这个单片机只有两个定时器,我用的不够。我该怎么办?那我就糊涂了。其实只要有硬件定时器,我们就可以在实际需求不是特别准确的情况下模拟很多软件定时器。今天群主给大家分享一个完全用C语言编写的软件定时器,高度便携,超级牛逼!

MultiTimer是一个软件定时器扩展模块,可以无限扩展你需要的定时器任务,取代传统的标志位判断模式,更加优雅方便的管理程序的时间触发定时。总共有3个文件:

multi_timer.c - timer c源文件;

multi_timer.h - timer h头文件;

主用户代码文件。

让我们直接编码:

/*

* main.c

*

*创建时间:20161229

* @作者:小雨karaxiaoyu@gmail.com

* @版本:V1.0.0

*

* ,%%%%%%%%,

* ,%%/%%%%/%%

*,%%%c''''J/%%%

* %.% % % %/o % % %

* `%%.%%%% |%%%

* `%% `%%%%(__Y__)%% '

* // ;%%%%`-/%%%'

* (( / `%%%%%%%'

* .|

* / | |

* / ) | |

* /_ | |__

* (_ _ _ _ _ _ _ _ _ _ _ _))))))))围攻狮子

*

*/

#包含“multi_timer.h”

structure timertimer 1;

structure timertimer 2;

voidtimer1_callback()

{

printf( "timer1超时!rn ");

}

voidtimer2 _ callback()

{

printf( "timer2超时!rn ");

}

intmain()

{

‍timer_init(&;定时器1,定时器1_callback,1000,1000);//1s循环

timer _ start(& amp;定时器1);

timer _ init(& amp;定时器2,定时器2_callback,50,0);//50毫秒延迟

timer _ start(& amp;定时器2);

while( 1) {

timer _ loop();

} ‍

}

voidHAL _ SYSTICK _回调(void)

{

timer _ ticks();//1毫秒刻度

}

1.首先申请定时器管理句柄

```

结构定时器定时器1;

```

2.初始化定时器对象,注册定时器回调处理函数,设置定时时间(ms),循环定时触发时间

```

timer_init(struct Timer* handle,void(*timeout_cb)(),uint32_t timeout,uint 32 _ t repeat);

```

3.启动计时器

```

timer _ start(& amp;定时器1);

```

4.将硬件定时器设置为1毫秒,以调用*timer_ticks()*来提供时间参考

```

无效HAL _ SYSTICK _回调(无效)

{

timer _ ticks();

}

```

5.在主循环中调用定时器后台处理函数

```

int main()

{ ...

while(1) {

...

timer _ loop();

}

}

```

上面我们定义了两个定时器,第一个每1秒循环执行一次,第二个定时器50 ms后只执行一次,执行后可以通过相应的回调函数打印出来,我们定时的任务可以添加到里面。怎么样?很简单吗?你只需要设置定时基准,申请一个定时器,初始化就可以了。你想要的效果是计时一次还是循环。它是通过在多个计时器之间使用链表来实现的,您可以启动和暂停每个计时器。用了之后,爽吗?对于具体的代码,需要仔细推敲原理。当然直接用就可以了。具体源代码我会上传到百度云后台和微信官方账号。注意背景。回复软件定时器下载源文件。感觉还不错。欢迎转发。是对群主的一种支持。谢谢!

部分源代码显示:

/*

* multi_timer.h

*

*创建时间:20161229

* @作者:小雨karaxiaoyu@gmail.com

* @版本:V1.0.0

*/

# ifndef _ MULTI _ TIMER _ H _

# define _ MULTI _ TIMER _ H u

#包含“stdint.h”

typedef structTimer {

uint32_t超时;

uint32 _ t repeat

void(* time out _ CB)(void);

structTimer * next

}定时器;

#ifdef __cplusplus

外部“C”{

#endif

void timer _ init(StructTimer * handle,void(*timeout_cb)(),uint32_t timeout,uint 32 _ t repeat);

int timer _ start(StructTiMer * handle);

voidtimer_stop(structTimer*句柄);

void timer _ ticks(void);

void timer _ loop(void);

//void Timer _ repeat(struct Timer *句柄);

//void Timer _ set _ repeat(struct Timer * handle,uint 32 _ t repeat);

#ifdef __cplusplus

}

#endif

#endif

/*

* multi_timer.c

*

*创建时间:20161229

* @作者:小雨karaxiaoyu@gmail.com

* @版本:V1.0.0

*/

#包含“multi_timer.h”

//定时器句柄列表头。

static struct Timer * head _ handle = NULL;

//计时器滴答

statuint 32 _ t _ timer _ ticks = 0;

/**

* @ briefInitializes计时器结构句柄。

* @paramhandle:定时器句柄strcut。

* @paramtimeout_cb: timeout回调。

* @paramrepeat:重复间隔时间。

* @retvalNone

*/

void timer_init(struct Timer*句柄,void(*timeout_cb)(),uint32_t timeout,uint32_t repeat)

{

// memset(句柄,sizeof(struct Timer),0);

手柄->;timeout _ cb = timeout _ cb

手柄->;time out = _ timer _ ticks+time out;

手柄->;重复=重复;

}

/**

* @ briefStart启动定时器工作,将句柄添加到工作列表中。

* @parambtn:目标句柄strcut。

* @retval0:成功。-1:已经存在。

*/

int timer_start(结构计时器*句柄)

{

struct Timer * target = head _ handle;

while(target) {

if(target = = handle)return-1;//已经存在。

target = target->接下来;

}

手柄->;next = head _ handle

head _ handle = handle

返回0;

}

/**

* @ briefStop关闭计时器工作,从工作列表中移除手柄。

* @paramhandle:目标句柄strcut。

* @retvalNone

*/

void timer_stop(结构计时器*句柄)

{

结构计时器**当前;

for(curr = & amp;head _ handle* curr) {

结构计时器*条目= * curr

if(entry == handle) {

*curr = entry->。接下来;

//免费(入门);

} else

curr = & amp条目->;接下来;

}

}

/**

* @briefmain循环。

* @ paramNone。

* @retvalNone

*/

void timer_loop()

{

结构计时器*目标;

for(target = head _ handle;目标;target=target->下一个){

if(_ timer _ ticks & gt;= target->超时){

if(target->;repeat == 0) {

timer_stop(目标);

} else{

目标->;time out = _ timer _ ticks+target-& gt。重复;

}

目标->;time out _ CB();

}

}

}

/**

* @briefbackground滴答,计时器重复调用间隔1毫秒。

* @ paramNone。

* @retvalNone。

*/

void timer_ticks()

{

_ timer _ ticks++;

}

1.《定时器软件 完全由C编写,高度可移植,超级牛逼的软件定时器!》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《定时器软件 完全由C编写,高度可移植,超级牛逼的软件定时器!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1152010.html

上一篇

江苏盐 江苏盐业集团有限公司

下一篇

韩国女明星的名字 韩国身价排名前十位的女明星 第一名竟长得这么好看

任天堂免费修手柄 到底是什么状况?

任天堂免费修手柄 到底是什么状况?

任天堂Switch的手柄漂移问题困扰了玩家很长时间,官方一直没有给出明确的答案。但据报道,任天堂将为用户提供免费的漂移手柄修复服务。据Switch Handle的报道,任天堂将为用户提供免费维修Switch漂移手柄的服务,...

PS5官网介绍暗示:PS5手柄将配置可升级固件 事件详细经过!

PS5官网介绍暗示:PS5手柄将配置可升级固件 事件详细经过!

PS5的双重感应手柄已经改变。索尼PS5官网上的DualSense手柄介绍底部隐藏的一句话确认了PS5手柄也将在固件上升级“始终将您的PS5系统软件和无线手柄设备软件更新到最新版本”这可能就是为什么PS5游戏不能用PS4手...

快手回应厕所装计时器 真相到底是怎样的?

  • 快手回应厕所装计时器 真相到底是怎样的?
  • 快手回应厕所装计时器 真相到底是怎样的?
  • 快手回应厕所装计时器 真相到底是怎样的?
ds4 DS4Windows手柄模拟器发布大型更新

ds4 DS4Windows手柄模拟器发布大型更新

另一个解决方案是DS4Windows工具。该工具可以模拟DS4控制器作为Xbox控制器。这个工具之前存放了很久,上周突然发布了一个大更新,提供了更漂亮的界面。完整的更新如下: -重写图形用户界面,用WPF代替原来的窗口窗体 -更多地使用应用程序数据绑定。更多地使用控制服务流程的自定义事件 -...

柄怎么读 PS手柄上的“X”,究竟该怎么读?

  • 柄怎么读 PS手柄上的“X”,究竟该怎么读?
  • 柄怎么读 PS手柄上的“X”,究竟该怎么读?
  • 柄怎么读 PS手柄上的“X”,究竟该怎么读?
flash倒计时器 Chrome 78可选在2周内忽略“Flash停用倒计时”提示!

flash倒计时器 Chrome 78可选在2周内忽略“Flash停用倒计时”提示!

[PConline Information]根据路线图,AdobeFlashPlayer浏览器插件将于2020年12月死亡,谷歌在Chrome76中已默认禁用。当访问仍然使用闪存插件的网站时,用户会看到令人讨厌的“xxx后将不再支持”提示。在听取反馈后,Google决定进一步优化,并在Chr...

电视游戏手柄 玩智能电视游戏需要买手柄吗?

电视游戏手柄 玩智能电视游戏需要买手柄吗?

随着近年来电子产品的跨越式发展,智能电视越来越受到千家万户的欢迎。但是,从电视视频受众用户的角度来看,电视节目的运营率与往年相比呈下降趋势。毕竟,人们拥有的电子产品更多,电视相比手机和电脑有很大的局限性。近年来,厂商推出的智能电视基本实现了手机的大部分功能。尤其是游戏取得了巨大的成就,那么电...

ps3手柄 PS4无线手柄在PS3上如何使用

ps3手柄 PS4无线手柄在PS3上如何使用

相信很多玩家都听说过索尼ps4手柄支持ps3的传闻,但其实索尼只是最近才正式宣布相关功能——PS4手柄可以无线链接PS3功能。虽然这个功能目前看起来有些缺陷,但是应该说从长远来看对ps3玩家是有利的。以下小系列将介绍如何在PS3上使用PS4无线控制器。 相信很多玩家都听说过索尼ps4手柄支持...