195 lines
5.1 KiB
C
195 lines
5.1 KiB
C
#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);
|
||
} |