作为一个电子嵌入式的人,相信定时器永远不会陌生。看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