Files
Leakage-Control/calib_board/usr/app/app_timer.c
2026-02-03 11:56:05 +08:00

196 lines
5.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_timer.h"
#include "app.h"
/* 函数声明 */
static void app_timer_task(void);
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class);
static void app_timer_task_increment_int(u16 ms_tick);
/******************************************
* 结构体: app_timer
* 功能: 应用定时器实例
* 描述: 定时器控制结构体的具体实例
*******************************************/
app_timer_t app_timer =
{
.p_timer_class = NULL,
.init = app_timer_init,
.task = app_timer_task,
.increment_int = app_timer_task_increment_int,
};
/* 全局指针,指向定时器结构体 */
app_timer_t *p_app_timer = &app_timer;
/******************************************
* 函数: app_timer_init
* 功能: 定时器初始化
* 参数: task_num - 任务数量
* p_timer_class - 任务时间片数组指针
* 返回: 无
* 描述: 初始化定时器,设置任务数量和任务数组
*******************************************/
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class)
{
p_app_timer->task_num = task_num;
p_app_timer->p_timer_class = p_timer_class;
}
/******************************************
* 函数: app_timer_task
* 功能: 定时器任务调度
* 参数: 无
* 返回: 无
* 描述: 执行所有已到时间的任务
*******************************************/
static void app_timer_task(void)
{
u16 i;
/* 检查任务数组是否有效 */
if(NULL == p_app_timer->p_timer_class)
{
return;
}
/* 遍历所有任务 */
for (i = 0; i < p_app_timer->task_num; i++)
{
/* 检查任务是否需要执行 */
if (p_app_timer->p_timer_class[i].run_flag)
{
p_app_timer->p_timer_class[i].run_flag = 0; /* 清除执行标志 */
/* 检查任务函数是否有效 */
if (p_app_timer->p_timer_class[i].task == NULL)
{
continue;
}
/* 执行任务函数 */
p_app_timer->p_timer_class[i].task();
}
}
}
/******************************************
* 函数: app_timer_task_increment_int
* 功能: 中断递增函数
* 参数: ms_tick - 毫秒增量
* 返回: 无
* 描述: 在中断中调用,更新定时器计数器和检查任务时间片
*******************************************/
static void app_timer_task_increment_int(u16 ms_tick)
{
u16 i;
/* 更新毫秒级计数器 */
p_app_timer->ms_tick++;
/* 更新秒级计数器 */
if(p_app_timer->ms_tick >= 1000)
{
p_app_timer->s_tick++;
}
/* 检查任务数组是否有效 */
if(NULL == p_app_timer->p_timer_class)
{
return;
}
/* 更新所有任务的时间片计数器 */
for (i = 0; i < p_app_timer->task_num; i++)
{
/* 检查任务计数器是否有效 */
if (p_app_timer->p_timer_class[i].timer_count)
{
p_app_timer->p_timer_class[i].timer_count--;
/* 检查是否到达任务执行时间 */
if (p_app_timer->p_timer_class[i].timer_count == 0)
{
p_app_timer->p_timer_class[i].run_flag = 1;
p_app_timer->p_timer_class[i].timer_count = p_app_timer->p_timer_class[i].timer_reload;
}
}
}
}
/******************************************
* 函数: app_timer_check_time_out
* 功能: 检查超时
* 参数: time_start - 计时开始时间
* time_now - 当前时间
* time_out - 超时时间
* 返回: TIME_TRUE - 已超时TIME_FALSE - 未超时
* 描述: 检查从time_start开始经过time_out时间后是否超时
* 考虑了计数器溢出的情况
*******************************************/
u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out)
{
u16 timer_activate_val;
/* 计算触发时间 */
timer_activate_val = time_out + time_start;
/* 考虑计数器溢出情况 */
if (timer_activate_val > time_start)
{
/* 未发生溢出 */
if ((time_now >= timer_activate_val) || (time_now < time_start))
{
return TIME_TRUE;
}
}
else if ((time_now >= timer_activate_val) && (time_now < time_start))
{
/* 发生溢出且当前时间在溢出后 */
return TIME_TRUE;
}
return TIME_FALSE;
}
/******************************************
* 函数: app_timer_check_run_time
* 功能: 计算剩余运行时间
* 参数: time_start - 计时开始时间
* time_now - 当前时间
* time_out - 超时时间
* 返回: 剩余时间(毫秒)
* 描述: 配合app_timer_check_time_out函数使用
* 计算距离超时还有多少时间,考虑了计数器溢出
*******************************************/
u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out)
{
u16 timer_activate_val;
/* 计算触发时间 */
timer_activate_val = time_out + time_start;
/* 考虑计数器溢出情况 */
if (timer_activate_val > time_start)
{
/* 未发生溢出,直接计算剩余时间 */
return (timer_activate_val - time_now);
}
else
{
/* 发生溢出,计算溢出后的剩余时间 */
return (65535U - time_now + timer_activate_val);
}
}
/******************************************
* 函数: delay_ms
* 功能: 阻塞式延时
* 参数: delay - 延时时间(毫秒)
* 返回: 无
* 描述: 使用HAL库提供的延时函数实现阻塞式延时
*******************************************/
void delay_ms(u16 delay)
{
HAL_Delay(delay);
}