// // 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) } }