lvgl-v8/UART/SimplUART/APP/userTimer.c

212 lines
5.9 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.

//
// Created by KS00596 on 2022/7/13.
//
#include "userTimer.h"
#include "pt.h"
#define TASK_MAX 20
// protoTheads 系统时间
volatile u32 ptSysTick = 0;
/**
* @brief 获取protoTheads 系统时间
*
* @return u32 系统经历了多少个tick
*/
u32 PT_GetSystemTime()
{
return ptSysTick;
}
typedef struct
{
USER_TIMER_HDL task[TASK_MAX];
} USER_TIME_TASK;
static USER_TIME_TASK tisTask;
/**
* @brief 新增一个定时器任务
*
* @param hdl 函数名
* @param priv 参数地址
* @param time 时间
* @return u8 ID号
*/
u8 UserTimerAdd(void *hdl, void *priv, u16 time)
{
u8 i = 0;
for (; i < TASK_MAX; i++)
{
if (tisTask.task[i].use == 0)
{
break;
}
}
if (i == TASK_MAX)
return TASK_CREAT_ERR;
/**********************************************************
行注释
内容normal
**********************************************************/
tisTask.task[i].hdl = hdl;
tisTask.task[i].tick = 0;
tisTask.task[i].time = time;
tisTask.task[i].use = 1;
tisTask.task[i].priv = priv;
tisTask.task[i].timeOut = 0;
/**********************************************************
行注释
内容prototheads
**********************************************************/
tisTask.task[i].ptTickYead=0;
tisTask.task[i].ptWake=0;
PT_INIT(&tisTask.task[i].pt);
return i;
}
/**
* @brief 重新设置定时器时间
*
* @param id 定时器ID号
* @param time 新的时间
*/
void UserTimerResetTime(u8 id, u16 time)
{
tisTask.task[id].tick = 0;
tisTask.task[id].time = time;
}
/**
* @brief 删除定时器
*
* @param id 定时器ID号
*/
void UserTimerDel(u8 id)
{
tisTask.task[id].use = 0;
}
/**
* @brief 添加一个超时定时器
*
* @param hdl 函数名
* @param priv 参数地址
* @param time 时间
* @return u8 定时器ID号
*/
u8 UserTimerOutAdd(void *hdl, void *priv, u16 time)
{
u8 i = 0;
for (; i < TASK_MAX; i++)
{
if (tisTask.task[i].use == 0)
{
break;
}
}
if (i == TASK_MAX)
return TASK_CREAT_ERR;
/**********************************************************
行注释
内容normal
**********************************************************/
tisTask.task[i].hdl = hdl;
tisTask.task[i].tick = 0;
tisTask.task[i].time = time;
tisTask.task[i].use = 1;
tisTask.task[i].priv = priv;
tisTask.task[i].timeOut = 1;
/**********************************************************
行注释
内容protothreads
**********************************************************/
tisTask.task[i].ptTickYead=0;
tisTask.task[i].ptWake=0;
PT_INIT(&tisTask.task[i].pt);
return i;
}
void UserTimerOutDel(u8 id)
{
tisTask.task[id].use = 0;
}
void UserTimerTask()
{
for (u8 i = 0; i < TASK_MAX; i++)
{
/**********************************************************
行注释
内容:定时器是否被使用
**********************************************************/
if (tisTask.task[i].use == 1)
{
/**********************************************************
行注释
内容检查下是否是由于prototheads挂起的任务
**********************************************************/
if (tisTask.task[i].ptTickYead)
{
tisTask.task[i].ptTickYead--;
if (tisTask.task[i].ptTickYead == 0)
{
/**********************************************************
行注释
内容protothread延迟到时间了执行下函数
**********************************************************/
tisTask.task[i].hdl(&tisTask.task[i],tisTask.task[i].priv);
/**********************************************************
行注释
内容:告诉绝对延时,程序已经被唤醒过了,不需要再执行
**********************************************************/
tisTask.task[i].ptWake = 1;
}
}
else
{
tisTask.task[i].ptWake = 0;
}
/**********************************************************
行注释
内容:检查下是否是绝对延时超时
**********************************************************/
if (tisTask.task[i].time <= tisTask.task[i].tick)
{
/**********************************************************
行注释
内容:清除超时标志
**********************************************************/
tisTask.task[i].tick = 0;
/**********************************************************
行注释
内容如果proto超时已经执行了则这里就不执行了并且重新开始计时
**********************************************************/
if (tisTask.task[i].ptWake)
{
tisTask.task[i].tick++;
continue;
}
/**********************************************************
行注释
内容:执行函数
**********************************************************/
tisTask.task[i].hdl(&tisTask.task[i],tisTask.task[i].priv);
/**********************************************************
行注释
内容:如果是超时任务则删除任务
**********************************************************/
if (tisTask.task[i].timeOut == 1)
{
tisTask.task[i].use = 0;
}
}
/**********************************************************
行注释
内容:定时器时间自增
**********************************************************/
tisTask.task[i].tick++;
} // if (tisTask.task[i].use == 1)
}
}