本工程使用链表创建了一个软件定时器, 利用链表的数据结构特征, 可以轻松实现极大量的定时器更新.
同时, 由于链表易于追加的特性, 我们可以很轻松地对它进行二次开发, 自由度极高.
如何使用 How to use?
-
创建一个结构体, 用于定义软件定时器, 并对其通过api进行初始化, 用于设置指定的触发次数.
//创建定时器结构体 softTimer_t timer_1; //设定定时触发值 softTimer_setup(&timer_1, 100);
-
创建一个回调函数, 并将其注册进对应的软件定时器,用于在定时触发时,调用该回调函数.
//创建回调函数 void timer1Callback(){ static int counter = 0; counter++; printf("timer1 update : %d\r\n", counter); } //将回调函数注册进指定的软件定时器 softTimer_attach(&timer_1, timer1Callback);
-
将定时器的tick节拍函数放置于一个稳定的定时中断之中.
//假设此处的定时中断为1ms触发一次, 则前文创建的软件定时器1为每100ms触发一次. while(1){ delay_ms(1); softTimer_tick(); }
完整示例 example
#include <stdio.h>
#include "unistd.h"
#include "softTimer.h"
void timer1Callback(){
static int counter = 0;
counter++;
printf("timer1 update : %d\r\n", counter);
}
void timer2Callback(){
static int counter = 0;
counter++;
printf("timer2 update : %d\r\n", counter);
}
void timer3Callback(){
static int counter = 0;
counter++;
printf("timer3 update : %d\r\n", counter);
}
int main() {
softTimer_setup(&timer_1, 1);
softTimer_setup(&timer_2, 2);
softTimer_setup(&timer_3, 3);
softTimer_attach(&timer_1, timer1Callback);
softTimer_attach(&timer_2, timer2Callback);
softTimer_attach(&timer_3, timer3Callback);
while(1){
sleep(1); //定时时间为1s
softTimer_tick();
}
return 0;
}
函数api解析
-
初始化软件定时器
void softTimer_setup(softTimer_t *target, int updateCount){ target->updateCount = updateCount; //写入更新时的节拍触发次数 list_add(&target->node, &softTimer_Head); }
-
注册回调函数
void softTimer_attach(softTimer_t *target, void(*func)()){ target->callBackFunction = func; //注册回调函数 }
-
定时节拍函数
void softTimer_tick(){ softTimer_t *softTimer_ptr; //创建一个软件定时器的结构体指针 list_for_each_entry(softTimer_ptr, &softTimer_Head, node){ //正向遍历定时器链表, 依次更新计数值. softTimer_ptr->count++; if(softTimer_ptr->count == softTimer_ptr->updateCount){ //若触发更新数值, 则清零计数值并触发回调函数. softTimer_ptr->count = 0; softTimer_ptr->callBackFunction(); } } }
补充: 关于链表
本工程主要基于侵入式链表进行开发, 有关侵入式链表的内容, 请移步我个人主页中的侵入式链表专题文章.
侵入式链表
本工程的开源地址
请自行前往github主页进行查看, 地址如下:
软件定时器-NinoC137
写在最后
如果我的开源有帮到你, 请star我的工程并follow我的github, 非常感谢.
持续性更新有价值, 有意义的嵌入式技术分享, 如有不足, 欢迎在评论区指出.