MQTT在单片机中的移植:MQTTClient-C定时器功能详解
接下来我们完善MQTTTimer.c和MQTTTimer.h两个功能
MQTTTimer.h
void TimerInit(Timer* timer);
Timer
结构体进行初始化。在 MQTT 客户端里,定时器被用于追踪各种操作的时间,像连接超时、心跳包发送间隔等。初始化操作会把定时器的内部状态设定为初始值,以保证后续计时操作的准确性。char TimerIsExpired(Timer* timer);
void TimerCountdownMS(Timer*, unsigned int ms);
Timer
结构体指针和一个无符号整数,表示要倒计时的毫秒数。void TimerCountdown(Timer*, unsigned int s);
TimerCountdownMS
类似,不过它是以秒为单位来设置定时器的倒计时。调用时需要传入 Timer
结构体指针和一个无符号整数,表示要倒计时的秒数。int TimerLeftMS(Timer* timer);
MQTTTimer.c
static Timer g_Timer;
void SysTickTimerHandler(void) ///< 挂在1ms定时器,确保时钟的准确性
{
g_Timer.systick_period++;
}
void TimerInit(Timer* timer)
{
timer->end_time = 0;
timer->systick_period = g_Timer.systick_period;
}
char TimerIsExpired(Timer* timer)
{
long var = g_Timer.systick_period;
var = var – timer->end_time;
return (var<=0);
}
void TimerCountdownMS(Timer* timer, unsigned int ms)
{
timer->systick_period = g_Timer.systick_period;
timer->end_time = timer->systick_period + ms;
}
void TimerCountdown(Timer* timer, unsigned int sec)
{
timer->systick_period = g_Timer.systick_period;
timer->end_time = timer->systick_period + sec*1000;
}
int TimerLeftMS(Timer* timer)
{
long val = 0;
timer->systick_period = g_Timer.systick_period;
val = timer->end_time – timer->systick_period;
return val;
}
定时器使用示例
#include "MQTTClient.h"
// 假设的 MQTT 客户端操作
void mqtt_client_operation() {
Timer timer;
// 初始化定时器
TimerInit(&timer);
// 设置 5 秒的连接超时时间
TimerCountdown(&timer, 5);
// 模拟连接操作
while (!TimerIsExpired(&timer)) {
// 进行连接相关的操作
// ...
// 获取剩余时间
int remaining_ms = TimerLeftMS(&timer);
if (remaining_ms % 1000 == 0) {
printf("连接操作还剩 %d 秒\n", remaining_ms / 1000);
}
}
if (TimerIsExpired(&timer)) {
printf("连接超时\n");
}
}
作者:完成大叔