软件定时器是一种在软件层面实现计时性能的机制,通过软件定时器,能够在特定工夫点或工夫距离触发特定的事件。软件定时器罕用于实现周期性工作、超时解决、定时器中断等性能。
软件定时器蕴含两个次要组件: 定时服务器和定时客户端。
- 定时服务器用于工夫治理和定时器解决。
- 定时客户端用于解决特定的超时解决, 它须要注册到定时服务器并提供一个回调函数。
/* 定时服务器 */
struct soft_timer_server
{
uint32_t time; /* 以后工夫 */
struct soft_timer_list list; /* 定时器链表 */
};
- time: 以后工夫 (从定时器启动到当初过来的工夫)。
- list: 定时器链表 (用于存储定时客户端)。
struct soft_timer_client
{
struct soft_timer_list list; /* 定时器链表 */
soft_timer_server_t server; /* 所属的服务器 */
uint32_t interval; /* 定时间隔时间 */
uint32_t timeout; /* 下次超时工夫 */
int (*cb)(soft_timer_client_t client, void *args); /* 超时回调函数 */
void *args; /* 超时回调函数参数 */
};
- list: 定时器链表 (用于挂载到服务器)。
- server: 所属的服务器。
- interval: 定时间隔时间 (初始化时设置)。
- timeout: 下次超时工夫。
- cb:回调函数。
- args:回调函数参数。
void soft_timer_server_init(soft_timer_server_t server);
void soft_timer_server_update(soft_timer_server_t server, uint32_t time);
参数 |
形容 |
server |
服务器句柄 |
time |
更新过来的工夫 |
void soft_timer_server_handle(soft_timer_server_t server);
int soft_timer_client_add(soft_timer_client_t client,
uint32_t time,
int (*cb)(soft_timer_client_t client, void *args),
void *args,
soft_timer_server_t server);
参数 |
形容 |
client |
客户端句柄 |
time |
客户端超时工夫 |
cb |
回调函数 |
args |
回调函数参数 |
server |
服务器句柄 |
返回 |
|
SOFT_TIMER_ERR_OK |
增加胜利 |
错误码 |
增加失败 |
int soft_timer_client_remove(soft_timer_client_t client);
参数 |
形容 |
client |
客户端句柄 |
返回 |
|
SOFT_TIMER_ERR_OK |
移除胜利 |
错误码 |
移除失败 |
int soft_timer_client_start(soft_timer_client_t client);
参数 |
形容 |
client |
客户端句柄 |
返回 |
|
SOFT_TIMER_ERR_OK |
启动胜利 |
错误码 |
启动失败 |
int soft_timer_client_stop(soft_timer_client_t client);
参数 |
形容 |
client |
客户端句柄 |
返回 |
|
SOFT_TIMER_ERR_OK |
暂停胜利 |
错误码 |
暂停失败 |
int soft_timer_client_add_then_start(soft_timer_client_t client,
uint32_t time,
int (*cb)(soft_timer_client_t client, void *args),
void *args,
soft_timer_server_t server);
参数 |
形容 |
client |
客户端句柄 |
time |
客户端超时工夫 |
cb |
回调函数 |
args |
回调函数参数 |
server |
服务器句柄 |
返回 |
|
SOFT_TIMER_ERR_OK |
增加胜利 |
错误码 |
增加失败 |
/* 定义定时器服务器和客户端 */
struct soft_timer_server server;
struct soft_timer_client timer1, timer2, timer3;
int timer1_callback(soft_timer_client_t client, void *args)
{printf("timer1_callback\r\n");
return MR_ERR_OK;
}
int timer2_callback(soft_timer_client_t client, void *args)
{printf("timer2_callback\r\n");
return MR_ERR_OK;
}
int timer3_callback(soft_timer_client_t client, void *args)
{printf("timer3_callback\r\n");
soft_timer_client_stop(client);
return MR_ERR_OK;
}
int main(void)
{
/* 初始化服务器 */
soft_timer_server_init(&server);
/* 增加客户端到服务器并启动 */
soft_timer_client_add_then_start(&timer1, 5, timer1_callback, MR_NULL, &server);
soft_timer_client_add_then_start(&timer2, 10, timer2_callback, MR_NULL, &server);
soft_timer_client_add_then_start(&timer3, 15, timer3_callback, MR_NULL, &server);
while (1)
{
/* 更新服务器时钟 */
soft_timer_server_update(&server, 1);
/* 服务器解决客户端超时(放在哪里,回调就将在哪里被调用)*/
soft_timer_server_handle(&server);
}
}
———-
———-
遵循 Apache License 2.0 开源许可协定,可收费利用于商业产品,无需公开公有代码。