213 lines
5.9 KiB
C
213 lines
5.9 KiB
C
//
|
||
// 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)
|
||
}
|
||
}
|