/****************************************Copyright (c)**************************************************
**
**----------------------------------------modification--------------------------------------------------
** 作 者:
** 日 期:
** 版 本: 标 记:
** 说 明:
**
********************************************************************************************************/
#include "hSch.h"
/*=======================================================
= 定时任务
=======================================================*/
typedef struct{
// rw: 指向任务的指针(必须是一个void(void)函数)
void ( *pTask)(void);
// rw: 延迟(Ticks)直到任务将(下一次)运行. 详细说明参照 HSchAddTask()
uint16 Delay;
// rw: 运行之间的间隔(Ticks). 详细说明参照 HSchAddTask()
uint16 Period;
// rw: 任务运行状态. 当任务需要运行时置1;停止时置0
uint8 EnableFlag;
// r : 任务触发状态标志. 当标准为1时表示任务需要触发
uint8 RunMe;
// rw : 如果任务是合作式的,设置为0
// 如果任务是抢占式的,设置为1
uint8 PreEmp;
}hschTypeDef;
static hschTypeDef hschTaskTab[HSCH_MAX_TASKS];
/**********************************************************************************
** 函数名称: void HSchInit(void)
** 功 能: 定时任务初始化
** 输入参数: void
** 输出参数: 无
** 返 回: void
***********************************************************************************/
void HSchInit(void)
{
uint8 i;
for (i=0; i < HSCH_MAX_TASKS; i++)
{
hschTaskTab[i].pTask = 0;
hschTaskTab[i].Delay = 0;
hschTaskTab[i].Period = 0;
hschTaskTab[i].EnableFlag = 0;
hschTaskTab[i].RunMe = 0;
hschTaskTab[i].PreEmp = 0;
}
}
/**********************************************************************************
** 函数名称: void HSchDispatchTasks(void)
** 功 能: 分析/处理定时任务
** 输入参数: void
** 输出参数: 无
** 返 回: void
***********************************************************************************/
void HSchDispatchTasks(void)
{
uint8 i;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].RunMe != 0)
{
(*hschTaskTab[i].pTask)();
hschTaskTab[i].RunMe = 0;
}
}
}
/**********************************************************************************
** 函数名称: void HSchUpdata(void)
** 功 能: 定时任务中断函数(中断服务程序)
** 输入参数: void
** 输出参数: 无
** 返 回: void
***********************************************************************************/
void HSchUpdata(void)
{
uint8 i;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].EnableFlag == 1)
{
if (hschTaskTab[i].Delay == 0)
{
// 预装循环计数周期
if (hschTaskTab[i].Period)
{
hschTaskTab[i].Delay = hschTaskTab[i].Period - 1;
}
else
{
hschTaskTab[i].EnableFlag = 0;
}
// 抢占式判断
if (hschTaskTab[i].PreEmp == 0)
{
hschTaskTab[i].RunMe = 1;
}
else
{
hschTaskTab[i].RunMe = 0;
(*hschTaskTab[i].pTask)();
}
}
else
{
hschTaskTab[i].Delay--;
}
}
}
}
/**********************************************************************************
** 函数名称: uint32 HSchAddTask(void (*m_pTask)(void), uint16 m_Delay,
uint16 m_Period, uint8 m_PreEmp)
** 功 能: 添加新的任务到任务列表
若任务已存在,则对任务进行更新。
注意:添加任务后的,该任务会自动起动
** 输入参数: m_pTask 将被调用的任务指针。任务类型为"void (void)"类型。
m_Delay 在任务第一次被运行之前的间隔,单位HSCH_TIM_UNIT
m_Period 运行周期,单位HSCH_TIM_UNIT
为0: 则该任务只被调用1次,由m_Delay确定调用的时间
不为0: 那么任务将按照m_Period确定的间隔重复调用。
m_PreEmp 0为合作式任务,
1为抢占式任务
** 输出参数: void
** 返 回: 0 操作成功
1 操作失败
***********************************************************************************/
uint8 HSchAddTask(void (*m_pTask)(void), uint16 m_Delay, uint16 m_Period, uint8 m_PreEmp)
{
uint8 i;
uint8 res = 0xff;
if (m_pTask == 0)
return 1;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].pTask == m_pTask)
{
res = i;
break;
}
else if ((res == 0xff) && (hschTaskTab[i].pTask == 0))
{
res = i;
}
}
if (res != 0xff)
{
hschTaskTab[res].Period = m_Period / HSCH_TICK_PERIOD;
if (hschTaskTab[res].Period == 0 && m_Period != 0)
hschTaskTab[res].Period = 1;
hschTaskTab[res].Delay = m_Delay / HSCH_TICK_PERIOD;
hschTaskTab[res].RunMe = 0;
hschTaskTab[res].PreEmp = (m_PreEmp == 0) ? 0 : 1;
hschTaskTab[res].pTask = m_pTask;
hschTaskTab[res].EnableFlag = 1;
return 0;
}
return 1;
}
/**********************************************************************************
** 函数名称: uint32 HSchDeletTask(void (*m_pTask)(void))
** 功 能: 删除定时任务
** 输入参数: m_pTask 定时任务函数
** 输出参数: 无
** 返 回: 0 操作成功
1 操作失败
***********************************************************************************/
uint8 HSchDeletTask(void (*m_pTask)(void))
{
uint8 i;
if (m_pTask == 0)
return 1;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].pTask == m_pTask)
{
hschTaskTab[i].EnableFlag = 0;
hschTaskTab[i].pTask = 0;
hschTaskTab[i].Delay = 0;
hschTaskTab[i].Period = 0;
hschTaskTab[i].RunMe = 0;
return 0;
}
}
return 1;
}
/**********************************************************************************
** 函数名称: uint8 HSchStopTask(void (*m_pTask)(void))
** 功 能: 停止定时任务
** 输入参数: m_pTask 任务函数
** 输出参数: 无
** 返 回: 0 操作成功
1 操作失败
***********************************************************************************/
uint8 HSchStopTask(void (*m_pTask)(void))
{
uint8 i;
if (m_pTask == 0)
return 1;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].pTask == m_pTask)
{
hschTaskTab[i].RunMe = 0;
hschTaskTab[i].EnableFlag = 0;
return 0;
}
}
return 1;
}
/**********************************************************************************
** 函数名称: uint8 HSchGetTaskState(void (*m_pTask)(void))
** 功 能: 读取任务的运行状态
** 输入参数: m_pTask 任务函数
** 输出参数: 无
** 返 回: 0 任务不存在
1 任务处于停止状态
2 任务处于运行状态
***********************************************************************************/
uint8 HSchGetTaskState(void (*m_pTask)(void))
{
uint8 i;
if (m_pTask == 0)
return 0;
for (i=0; i<HSCH_MAX_TASKS; i++)
{
if (hschTaskTab[i].pTask == m_pTask)
{
return hschTaskTab[i].EnableFlag + 1;
}
}
return 0;
}
一个基于时间的任务调度器
80 浏览量
2023-06-13
20:57:55
上传
评论
收藏 3KB ZIP 举报
sven365
- 粉丝: 9
- 资源: 24
最新资源
- html+css+'青春献礼二十大 红色旅游助乡村'为主题的网页设计 2022年参与学校网页设计比赛时完成的
- Unity 模型布尔运算插件
- eCANtools工具,CAN资料包
- 129335283047061xiazaigongjuxiang(去重软件).apk
- Android环境检测工具,检测ksu,lsp,magisk等
- WordPress后台美化插件QuarterAdmin分享
- PCB_Project单片机绘制 (2024-5-11 22-22-13).zip
- nccl-local-repo-ubuntu2204-2.21.5-cuda12.4-1.0-1-amd64
- STM32移植LVGL源码工程 stm32移植GUI-Guider源码 LVGL移植源码
- Screenshot_20240522_084328_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈