165 lines
4.2 KiB
C
165 lines
4.2 KiB
C
#include "app_config.h"
|
|
#include "interface.h"
|
|
|
|
#include "app_frm_timer.h"
|
|
#include "app_frm_signal.h"
|
|
|
|
// 全局计时器列表头指针
|
|
static Timer *timer_list = NULL;
|
|
|
|
// 添加一个静态变量来跟踪当前定时器数量
|
|
static uint32_t current_timer_count = 0;
|
|
|
|
// 初始化定时器
|
|
void timerInit(Timer *timer)
|
|
{
|
|
if (timer == NULL)
|
|
{
|
|
return;
|
|
}
|
|
timer->target_time = 0;
|
|
timer->elapsed_time = 0;
|
|
timer->start_time = 0;
|
|
timer->active = 0;
|
|
timer->priority = 1; // 默认优先级为1
|
|
timer->next = NULL;
|
|
}
|
|
|
|
// 修改 timerStart 函数
|
|
void timerStart(Timer *timer, uint32_t target_time, unsigned char priority)
|
|
{
|
|
if (timer == NULL || target_time == 0)
|
|
{
|
|
printf("Error: Null timer pointer or invalid target time\n");
|
|
return;
|
|
}
|
|
|
|
// 检查定时器是否已经在列表中
|
|
Timer *current = timer_list;
|
|
while (current != NULL)
|
|
{
|
|
if (current == timer)
|
|
{
|
|
// 定时器已在列表中, 只需更新其参数
|
|
irq_state_t saved_state = enter_critical_section();
|
|
|
|
timer->target_time = target_time;
|
|
timer->start_time = getCurrentTime();
|
|
timer->elapsed_time = 0;
|
|
timer->active = 1;
|
|
timer->priority = priority;
|
|
|
|
exit_critical_section(saved_state);
|
|
return;
|
|
}
|
|
current = current->next;
|
|
}
|
|
|
|
// 检查是否达到最大定时器数量
|
|
if (current_timer_count >= MAX_TIMERS)
|
|
{
|
|
printf("Error: Maximum number of timers reached\n");
|
|
return;
|
|
}
|
|
|
|
// 初始化新定时器
|
|
irq_state_t saved_state = enter_critical_section();
|
|
|
|
timer->target_time = target_time;
|
|
timer->start_time = getCurrentTime();
|
|
timer->elapsed_time = 0;
|
|
timer->active = 1;
|
|
timer->priority = priority;
|
|
|
|
// 将定时器插入到定时器列表
|
|
timer->next = timer_list;
|
|
timer_list = timer;
|
|
current_timer_count++;
|
|
|
|
exit_critical_section(saved_state);
|
|
}
|
|
|
|
// 停止定时器
|
|
void timerStop(Timer *timer)
|
|
{
|
|
if (timer == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
irq_state_t saved_state = enter_critical_section();
|
|
|
|
Timer *current = timer_list;
|
|
Timer *prev = NULL;
|
|
while (current != NULL)
|
|
{
|
|
if (current == timer)
|
|
{
|
|
// 从链表中移除定时器
|
|
if (prev == NULL)
|
|
{
|
|
timer_list = current->next;
|
|
}
|
|
else
|
|
{
|
|
prev->next = current->next;
|
|
}
|
|
current_timer_count--;
|
|
timer->active = 0;
|
|
timer->next = NULL; // 断开链接
|
|
break;
|
|
}
|
|
prev = current;
|
|
current = current->next;
|
|
}
|
|
|
|
exit_critical_section(saved_state);
|
|
}
|
|
|
|
// 更新所有定时器, 在定时器中断中调用
|
|
void timerUpdateAll(void)
|
|
{
|
|
irq_state_t saved_state = enter_critical_section();
|
|
|
|
Timer *prev = NULL;
|
|
Timer *current = timer_list;
|
|
|
|
while (current != NULL)
|
|
{
|
|
if (current->active)
|
|
{
|
|
current->elapsed_time++;
|
|
if (current->elapsed_time >= current->target_time)
|
|
{
|
|
current->active = 0;
|
|
// 发送定时器过期消息
|
|
publishMessage((void *)(uintptr_t)current, current->priority);
|
|
|
|
// 从链表中移除已过期的定时器
|
|
if (prev == NULL)
|
|
{
|
|
timer_list = current->next;
|
|
}
|
|
else
|
|
{
|
|
prev->next = current->next;
|
|
}
|
|
current_timer_count--;
|
|
Timer *expired_timer = current;
|
|
current = current->next;
|
|
expired_timer->next = NULL; // 断开链接
|
|
continue; // 跳过前进 prev 指针
|
|
}
|
|
}
|
|
prev = current;
|
|
current = current->next;
|
|
}
|
|
|
|
exit_critical_section(saved_state);
|
|
}
|
|
|
|
// 获取当前定时器数量
|
|
uint32_t getCurrentTimerCount(void)
|
|
{
|
|
return current_timer_count;
|
|
} |