UP 路径优化
This commit is contained in:
114
lib/task/inc/task.h
Normal file
114
lib/task/inc/task.h
Normal file
@@ -0,0 +1,114 @@
|
||||
#ifndef TASK_H
|
||||
#define TASK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "stdint.h"
|
||||
|
||||
#define true 0
|
||||
#define false (-1)
|
||||
//平台切换相关类型重定义
|
||||
typedef int64_t TaskStatus_t;
|
||||
typedef uint64_t TaskTime_t;
|
||||
typedef int64_t TaskCnt_t;
|
||||
|
||||
typedef struct TaskList Task_t;
|
||||
|
||||
typedef uint64_t (*PlatformTicksFunc_t)(void);
|
||||
|
||||
typedef void (*Task_Callback_t)(Task_t *task, void *userdata);
|
||||
|
||||
struct TaskList {
|
||||
Task_t *next;
|
||||
uint8_t enable;
|
||||
TaskCnt_t runcnt;
|
||||
TaskTime_t lasttime;
|
||||
TaskTime_t intervaltime;
|
||||
Task_Callback_t callback;
|
||||
void *userdata;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 初始化任务模块
|
||||
* @param TicksFunc: [输入] 时间基准函数指针
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskInit(GetPlatformTicks);
|
||||
*/
|
||||
TaskStatus_t TaskInit(PlatformTicksFunc_t TicksFunc);
|
||||
|
||||
|
||||
/**
|
||||
* @brief 创建任务
|
||||
* @param task: [输入/输出] 任务结构体指针
|
||||
* @param time: [输入] 间隔时间
|
||||
* @param runcnt: [输入] 执行次数,-1为无限制执行,0为只创建不运行
|
||||
* @param callback: [输入] 回调函数
|
||||
* @param userdata: [输入] 用户数据传参
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskCreat(&myTask, 100, -1, myCallbackFunc, &myData);
|
||||
*/
|
||||
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata);
|
||||
|
||||
/**
|
||||
* @brief 添加任务
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskAdd(&myTask);
|
||||
*/
|
||||
TaskStatus_t TaskAdd(Task_t *task);
|
||||
|
||||
/**
|
||||
* @brief 删除任务
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskDel(&myTask);
|
||||
*/
|
||||
TaskStatus_t TaskDel(Task_t *task);
|
||||
|
||||
/**
|
||||
* @brief 重新开始停止的任务
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskStart(&myTask);
|
||||
*/
|
||||
TaskStatus_t TaskStart(Task_t *task);
|
||||
|
||||
/**
|
||||
* @brief 暂停任务执行
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskStop(&myTask);
|
||||
*/
|
||||
TaskStatus_t TaskStop(Task_t *task);
|
||||
|
||||
/**
|
||||
* @brief 重设任务执行次数
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @param runcnt: [输入] 新的执行次数
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskSetCnt(&myTask, 5);
|
||||
*/
|
||||
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt);
|
||||
|
||||
/**
|
||||
* @brief 重设任务间隔时间
|
||||
* @param task: [输入] 任务结构体指针
|
||||
* @param time: [输入] 新的间隔时间
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskSetTime(&myTask, 50);
|
||||
*/
|
||||
|
||||
TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time);
|
||||
|
||||
/**
|
||||
* @brief 任务调度
|
||||
* @return TaskStatus_t 返回任务状态
|
||||
* @example TaskRun();
|
||||
*/
|
||||
TaskStatus_t TaskRun(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //TASK_H
|
133
lib/task/task.cpp
Normal file
133
lib/task/task.cpp
Normal file
@@ -0,0 +1,133 @@
|
||||
#include "task.h"
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
|
||||
static Task_t *TaskHead = NULL;
|
||||
static PlatformTicksFunc_t platformTicksFunc = NULL;
|
||||
|
||||
TaskStatus_t TaskInit(PlatformTicksFunc_t ticksFunc) {
|
||||
platformTicksFunc = ticksFunc;
|
||||
TaskHead = (Task_t *) malloc(sizeof(Task_t));
|
||||
memset(TaskHead, 0, sizeof(Task_t));
|
||||
TaskHead->enable = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata) {
|
||||
if (!callback) {
|
||||
return false;
|
||||
}
|
||||
if (task) {
|
||||
TaskDel(task);
|
||||
}
|
||||
task = (Task_t *) malloc(sizeof(Task_t));
|
||||
memset(task, 0, sizeof(Task_t));
|
||||
task->intervaltime = time;
|
||||
task->lasttime = platformTicksFunc() + task->intervaltime;
|
||||
task->runcnt = runcnt;
|
||||
task->enable = true;
|
||||
task->callback = callback;
|
||||
task->userdata = userdata;
|
||||
task->next = NULL;
|
||||
return TaskAdd(task);;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskAdd(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
Task_t *p = TaskHead;
|
||||
while (p->next != NULL) {
|
||||
p = p->next;
|
||||
}
|
||||
p->next = task;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskDel(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
Task_t *p = TaskHead;
|
||||
Task_t *prev = NULL;
|
||||
while (p->next != NULL) {
|
||||
//保存当前节点的前一个节点的指针
|
||||
prev = p;
|
||||
//然后让当前的指针继续往后移动
|
||||
p = p->next;
|
||||
//判断,找到了要删除的数据
|
||||
if (p == task) {
|
||||
//两种情况,一种是普通节点,还有一种是尾节点
|
||||
if (p->next != NULL) //普通节点的情况
|
||||
{
|
||||
prev->next = p->next;
|
||||
free(p);
|
||||
p = NULL;
|
||||
} else //尾节点的情况
|
||||
{
|
||||
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
|
||||
free(p);
|
||||
p = NULL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskStart(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
if (task->runcnt == 0) { task->runcnt = 1; }
|
||||
task->enable = true;
|
||||
task->lasttime = platformTicksFunc() + task->intervaltime;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskStop(Task_t *task) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->enable = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->runcnt = runcnt;
|
||||
if (!task->enable && runcnt != 0) task->enable = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time) {
|
||||
if (task == NULL) {
|
||||
return false;
|
||||
}
|
||||
task->intervaltime = time;
|
||||
return true;
|
||||
}
|
||||
|
||||
TaskStatus_t TaskRun(void) {
|
||||
Task_t *p = TaskHead;
|
||||
while (p != NULL) {
|
||||
if (p->enable == true && platformTicksFunc() >= p->lasttime) {
|
||||
if (p->runcnt == 0) {
|
||||
p->enable = false;
|
||||
p->lasttime = 0;
|
||||
continue;
|
||||
}
|
||||
if (p->callback) {
|
||||
p->callback(p, p->userdata);
|
||||
p->lasttime = platformTicksFunc() + p->intervaltime;
|
||||
}
|
||||
if (p->runcnt > 0) {
|
||||
p->runcnt--;
|
||||
}
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
return true;
|
||||
}
|
Reference in New Issue
Block a user