/**
* @addtogroup module_TimerTask
* @{
*/
/**
* @file
* @brief 定时任务调度器接口。
* @details 提供定时任务调度相关的操作。
* @version 1.0.0
* @author kim.xiejinqiang
* @date 2012-6-4
*/
#include "SysTickAdapter.h"
#include "TimerTaskScheduler.h"
#include "../BgTask/BgTaskScheduler.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
static void TimerTaskScheduler_BgTaskHandle(void);
// 定义后台任务
BGTASK_DEFINE(g_kBgTaskTimerScheduler, TimerTaskScheduler_BgTaskHandle);
// Tick 计数
static volatile TimerTaskCounter s_tickCount;
// TimerTaskCounter 最大值(回环值)
// 作回环修正用,当计数到最大值时回到0再计数,所以需要修正
#define TIMER_TASK_COUNTER_MAX ((TimerTaskCounter)-1)
/**
* @brief 初始化定时任务调度器。
*/
void TimerTaskScheduler_Init()
{
SYS_TICK_INIT();
s_tickCount = 0;
}
/**
* @brief 开启定时任务调度器。
*/
void TimerTaskScheduler_Start()
{
SYS_TICK_START();
}
/**
* @brief 停止定时任务调度器。
*/
void TimerTaskScheduler_Stop()
{
SYS_TICK_STOP();
}
/**
* @brief 获取全局的嘀嗒计数值。
* @return 当前嘀嗒计数值。
*/
TimerTaskCounter TimerTaskScheduler_GetTick()
{
return s_tickCount;
}
/**
* @brief 启用指定的任务,定时器开始计时。
* @param task 要启用的任务。
*/
void TimerTask_Start(const TimerTask * task)
{
if (task)
{
*(task->status) = TIMER_TASK_S_VALID;
*(task->lastTick) = s_tickCount;
}
}
/**
* @brief 启用指定的任务,定时器开始计时。
* @param task 要启用的任务。
* @note 此函数与TimerTask_Start的区别在于,可以使任务马上再次运行
*/
void TimerTask_StartNow(const TimerTask * task)
{
if (task)
{
*(task->status) = TIMER_TASK_S_VALID;
*(task->lastTick) = s_tickCount - *(task->triggerTicks);
}
}
/**
* @brief 停止指定的任务。
* @param task 要停止的任务。
*/
void TimerTask_Stop(const TimerTask * task)
{
if (task)
{
*(task->status) = TIMER_TASK_S_INVALID;
}
}
/**
* @brief 查询任务的触发周期。
* @param task 要查询的任务。
* @return 任务的触发周期,单位为毫秒。
*/
TimerTaskCounter TimerTask_GetPeriod(const TimerTask * task)
{
TimerTaskCounter period = 0;
if (task)
{
period = *(task->triggerTicks) * TIMER_TASK_TICK_TIME;
}
return period;
}
/**
* @brief 调整定时任务的触发周期。
* @details 对于使用 @ref TIMER_TASK_DEFINE_VP 或 @ref TIMER_TASK_DEFINE_VP_EX
* 这些带VP的宏定义的定时任务,启动后仍然可以调用本函数改变其触发周期。
* @param task 要调整的任务。
* @param period 要调整的触发周期,即多长时间触发一次。单位为毫秒。
* @warning 本函数只适用于带VP的宏(如 @ref TIMER_TASK_DEFINE_VP
* 或 @ref TIMER_TASK_DEFINE_VP_EX )定义的定时任务,对于使用其它宏定义的任务,
* 调用本函数会引发严重异常。
*/
void TimerTask_SetPeriod(const TimerTask * task, TimerTaskCounter period)
{
if (task)
{
*(task->triggerTicks) = period / TIMER_TASK_TICK_TIME;
}
}
/**
* @brief 定时调度器使用的后台任务处理函数。
* @details 查看那些 Timer 任务到了时间,到时间的任务需要调用其处理函数。
*/
void TimerTaskScheduler_BgTaskHandle(void)
{
TimerTask * pTask;
TimerTask ** ppTask;
TimerTaskCounter tick;
// 指向任务表表头
ppTask = (TimerTask **) g_kTimerTaskTable;
// 循环遍历每一个任务,检查其时间是否到期,到期即调用处理函数
pTask = *ppTask;
while (pTask)
{
// 仅需处理激活的任务
if (*(pTask->status) == BGTASK_S_VALID)
{
// 取得该任务的上一次 Tick 值
tick = *(pTask->lastTick);
// 计算消逝的时间(Ticks),注意计数回环时需要修正
if (s_tickCount > tick)
{
tick = s_tickCount - tick;
}
else
{
tick = TIMER_TASK_COUNTER_MAX - tick;
tick++;
tick += s_tickCount;
}
// 任务的定时时间到,触发任务
if (tick >= *(pTask->triggerTicks))
{
*(pTask->lastTick) = s_tickCount;
pTask->handle();
}
}
pTask = (*(++ppTask));
}
}
/**
* @brief TimerTask 中断处理函数。
*/
void TimerTaskScheduler_IntHandle(void)
{
// Tick 计数
s_tickCount++;
// 定时任务处理函数的处理时间不确定,交由后台任务完成
BGTASK_ACTIVATE_INT(g_kBgTaskTimerScheduler);
}
/** @} */
没有合适的资源?快使用搜索试试~ 我知道了~
linux软件定时器代码
共7个文件
h:5个
c:2个
需积分: 5 7 下载量 200 浏览量
2019-05-28
18:14:31
上传
评论
收藏 9KB ZIP 举报
温馨提示
linux平台,支持应用程序同时创建多个软件定时器任务,基于C语言!
资源推荐
资源详情
资源评论
收起资源包目录
TimerTask.zip (7个子文件)
TimerTask
TimerTaskConfig.h 1KB
TimerTaskScheduler.h 1004B
Readme.h 6KB
TimerTask.h 10KB
TimerTaskScheduler.c 5KB
SysTickAdapter.h 2KB
TimerTask.c 1KB
共 7 条
- 1
资源评论
Socko.Lee
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功