UP Task,Argpase

This commit is contained in:
JiXieShi
2024-05-10 13:47:39 +08:00
parent 84bc401ba4
commit be1d31e732
18 changed files with 591 additions and 63 deletions

41
lib/inc/arg/argpase.h Normal file
View File

@@ -0,0 +1,41 @@
#ifndef ARGPASE_H
#define ARGPASE_H
typedef char OptId;
typedef struct Option {
char *name;
OptId id;
} Option;
typedef struct OptList {
struct OptList *next;
Option *Option;
} OptList;
extern char *Optarg, *Optstr;
//索引指示可手动重载为0
extern int Optindex;
//选项链表创建
OptList *Options_Creat(char *opt, OptId index);
//使用选项结构体创建
OptList *Options_CreatOpt(Option *opt);
//添加
void Options_Add(OptList *opts, OptList *opt);
//删除
bool Options_Del(OptList *opts, char *opt);
//打印选项和id
void Options_Print(OptList *opts);
//开始匹配参数
OptId Options_Load(OptList *opts, char *argv[], size_t argc);
//字符串转参数数组
size_t Str_To_Args(char *str, char *argv[]);
#endif //ARGPASE_H

View File

@@ -1,9 +1,5 @@
//
// Created by lydxh on 2024/5/9.
//
#ifndef HW_LIB_IIC_H
#define HW_LIB_IIC_H
#ifndef SW_LIB_IIC_H
#define SW_LIB_IIC_H
#include <stdint.h>
@@ -23,7 +19,7 @@ typedef struct {
uint8_t (*SDA)(); // 读取数据引脚状态的函数指针
uint8_t (*SDA_MODE)(uint8_t); // 设置数据引脚模式的函数指针
uint8_t ADD; // IIC设备地址
} HW_Dev_IIC;
} SW_Dev_IIC;
/**
* @brief 向 IIC 设备写入数据流
@@ -33,7 +29,7 @@ typedef struct {
* @param Len: [输入] 数据流长度
* @return void
**/
void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len);
void SW_IIC_WL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len);
/**
* @brief 从 IIC 设备读取数据流
@@ -44,6 +40,6 @@ void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uin
* @param Ack: [输入] 确认应答位
* @return void
**/
void HW_IIC_RL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack);
void SW_IIC_RL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack);
#endif //HW_LIB_IIC_H
#endif //SW_LIB_IIC_H

View File

@@ -1,15 +1,11 @@
//
// Created by lydxh on 2024/4/8.
//
#ifndef HW_LIB_SPI_H
#define HW_LIB_SPI_H
#ifndef SW_LIB_SPI_H
#define SW_LIB_SPI_H
#include <stdint.h>
#define HIGH 1
#define LOW 0
#define NOP() ;
#define NOP() 0
#define DELAY1US() NOP()
/**
@@ -42,7 +38,7 @@ typedef struct {
mode MODE; // SPI模式
uint8_t CS; // CS引脚编号
endian ENDIAN; // 数据端序
} HW_Dev_Spi;
} SW_Dev_Spi;
/**
* @brief 向 SPI 设备写入一个字节并读取返回的数据
@@ -50,7 +46,7 @@ typedef struct {
* @param Write_Date: [输入]要写入的数据
* @return 读取到的数据
**/
uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date);
uint8_t SW_SPI_RW(SW_Dev_Spi Dev, uint8_t Write_Date);
/**
* @brief 向 SPI 设备写入数据流
@@ -59,7 +55,7 @@ uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date);
* @param Len: [输入] 数据流长度
* @return void
**/
void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len);
void SW_SPI_WL(SW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len);
/**
* @brief 从 SPI 设备读取数据流
@@ -68,7 +64,7 @@ void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len);
* @param Len: [输入] 读取数据流长度
* @return void
**/
void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len);
void SW_SPI_RL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len);
/**
* @brief 向 SPI 设备写入数据并读取返回数据流
@@ -78,7 +74,7 @@ void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len);
* @param Len: [输入] 数据流长度
* @return void
**/
void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len);
void SW_SPI_RWL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len);
/**
* @brief 向 SPI 设备写入一个字16位并读取返回的数据
@@ -86,7 +82,7 @@ void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_
* @param Write_Date: [输入]要写入的数据
* @return 读取到的数据
**/
uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date);
uint16_t SW_SPI_RW16(SW_Dev_Spi Dev, uint16_t Write_Date);
/**
* @brief 从 SPI 设备读取数据流16位
@@ -95,7 +91,7 @@ uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date);
* @param Len: [输入] 读取数据流长度
* @return void
**/
void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len);
void SW_SPI_RL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len);
/**
* @brief 向 SPI 设备写入数据流16位
@@ -104,7 +100,7 @@ void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len);
* @param Len: [输入] 数据流长度
* @return void
**/
void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len);
void SW_SPI_WL16(SW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len);
/**
* @brief 向 SPI 设备写入数据并读取返回数据流16位
@@ -114,6 +110,6 @@ void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len);
* @param Len: [输入] 数据流长度
* @return void
**/
void HW_SPI_RWL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len);
void SW_SPI_RWL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len);
#endif //HW_LIB_SPI_H
#endif //SW_LIB_SPI_H

13
lib/inc/target.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef RETARGET_H
#define RETARGET_H
#include <sys/stat.h>
#include <stdio.h>
void RetargetInit(UART_HandleTypeDef *huart);
int _write(int fd, char *ptr, int len);
int _read(int fd, char *ptr, int len);
#endif //#ifndef RETARGET_H

60
lib/inc/task/task.h Normal file
View File

@@ -0,0 +1,60 @@
#ifndef TASK_H
#define TASK_H
#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;
};
//时间基准注册建议1-10ms的基准
TaskStatus_t TaskInit(PlatformTicksFunc_t TicksFunc);
//创建任务
// time:间隔时间
// runcnt:执行次数 为-1无限制执行 为0只创建不运行
// callback:回调函数
// userdata:用户数据传参
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata);
//添加任务
TaskStatus_t TaskAdd(Task_t *task);
//删除任务
TaskStatus_t TaskDel(Task_t *task);
//重新开始以停止的任务
TaskStatus_t TaskStart(Task_t *task);
//暂停任务执行
TaskStatus_t TaskStop(Task_t *task);
//重设任务执行次数
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt);
//重设任务间隔时间
TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time);
//任务调度
TaskStatus_t TaskRun(void);
#endif //TASK_H

106
lib/src/arg/argpase.c Normal file
View File

@@ -0,0 +1,106 @@
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include "argpase.h"
char *Optarg, *Optstr;
int Optindex = 0;
OptList *Options_Creat(char *name, OptId index) {
OptList *p;
p = (OptList *) malloc(sizeof(OptList));
memset(p, 0, sizeof(OptList));
Option *opt = (Option *) malloc(sizeof(Option));
memset(opt, 0, sizeof(Option));
opt->name = name;
opt->id = index;
p->Option = opt;
p->next = NULL;
return p;
}
OptList *Options_CreatOpt(Option *opt) {
OptList *p;
p = (OptList *) malloc(sizeof(OptList));
memset(p, 0, sizeof(OptList));
p->Option = opt;
p->next = NULL;
return p;
}
void Options_Add(OptList *opts, OptList *opt) {
OptList *p = opts;
while (NULL != p->next) {
p = p->next;
}
p->next = opt;
}
bool Options_Del(OptList *opts, char *opt) {
//获取当前头节点的位置
OptList *p = opts;
OptList *prev = NULL;
while (NULL != p->next) {
//保存当前节点的前一个节点的指针
prev = p;
//然后让当前的指针继续往后移动
p = p->next;
//判断,找到了要删除的数据
if (0 == strcmp(p->Option->name, opt)) {
//两种情况,一种是普通节点,还有一种是尾节点
if (p->next != NULL) //普通节点的情况
{
prev->next = p->next;
free(p);
} else //尾节点的情况
{
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
free(p);
}
return true;
}
}
return false;
}
void Options_Print(OptList *opts) {
OptList *p = opts;
while (NULL != p) {
printf("Option[%d]:%s\n", p->Option->id, p->Option->name);
p = p->next;
}
}
OptId Options_Load(OptList *opts, char *argv[], size_t argc) {
OptList *p = opts;
OptId id = -2;
while (NULL != p) {
if (0 == strcmp(p->Option->name, argv[Optindex])) {
Optarg = argv[Optindex + 1];
Optstr = p->Option->name;
id = p->Option->id;
}
p = p->next;
}
Optindex++;
if (Optindex >= argc) {
return -1;
}
return id;
}
size_t Str_To_Args(char *str, char *argv[]) {
char *p;
size_t argc = 0;
size_t l = strlen(str);
char *buf = (char *) malloc(sizeof(char) * l + 1);
strcpy(buf, str);
p = strtok(buf, " ");
while (p) {
argv[argc] = p;
argc++;
p = strtok(NULL, " ");
}
return argc;
}

View File

@@ -1,6 +1,6 @@
#include "iic.h"
static inline void iic_Start(HW_Dev_IIC dev) {
static inline void iic_Start(SW_Dev_IIC dev) {
dev.SDA_MODE(OUT);
dev.SDA_SET(HIGH);
dev.CLK_SET(HIGH);DELAY1US();
@@ -9,7 +9,7 @@ static inline void iic_Start(HW_Dev_IIC dev) {
}
//结束信号
static inline void iic_Stop(HW_Dev_IIC dev) {
static inline void iic_Stop(SW_Dev_IIC dev) {
dev.SDA_MODE(OUT);
dev.CLK_SET(LOW);
dev.SDA_SET(LOW);DELAY1US();
@@ -18,7 +18,7 @@ static inline void iic_Stop(HW_Dev_IIC dev) {
}
//等待信号响应
static inline uint8_t iic_WaitAck(HW_Dev_IIC dev, uint16_t timeout) {
static inline uint8_t iic_WaitAck(SW_Dev_IIC dev, uint16_t timeout) {
uint16_t time = 0;
dev.SDA_MODE(IN);
dev.SDA_SET(HIGH);DELAY1US();
@@ -34,7 +34,7 @@ static inline uint8_t iic_WaitAck(HW_Dev_IIC dev, uint16_t timeout) {
return 0;
}
static inline void iic_Ack(HW_Dev_IIC dev) {
static inline void iic_Ack(SW_Dev_IIC dev) {
dev.CLK_SET(LOW);
dev.SDA_MODE(OUT);
dev.SDA_SET(LOW);DELAY1US();DELAY1US();
@@ -42,7 +42,7 @@ static inline void iic_Ack(HW_Dev_IIC dev) {
dev.CLK_SET(LOW);
}
static inline void iic_NAck(HW_Dev_IIC dev) {
static inline void iic_NAck(SW_Dev_IIC dev) {
dev.CLK_SET(LOW);
dev.SDA_MODE(OUT);
dev.SDA_SET(HIGH);DELAY1US();DELAY1US();
@@ -51,7 +51,7 @@ static inline void iic_NAck(HW_Dev_IIC dev) {
}
//写入一个字节
static inline void iic_W(HW_Dev_IIC dev, uint8_t date) {
static inline void iic_W(SW_Dev_IIC dev, uint8_t date) {
dev.SDA_MODE(OUT);
uint8_t i;
for (i = 0; i < 8; i++) {
@@ -67,7 +67,7 @@ static inline void iic_W(HW_Dev_IIC dev, uint8_t date) {
}
}
static inline uint8_t iic_R(HW_Dev_IIC dev, uint8_t ack) {
static inline uint8_t iic_R(SW_Dev_IIC dev, uint8_t ack) {
unsigned char i, read = 0;
dev.SDA_MODE(IN);
for (i = 0; i < 8; i++) {
@@ -83,7 +83,7 @@ static inline uint8_t iic_R(HW_Dev_IIC dev, uint8_t ack) {
return read;
}
void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len) {
void SW_IIC_WL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len) {
iic_Start(Dev);
iic_W(Dev, Dev.ADD);
iic_WaitAck(Dev, 200);
@@ -96,7 +96,7 @@ void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uin
iic_Stop(Dev);
}
void HW_IIC_RL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack) {
void SW_IIC_RL(SW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack) {
iic_Start(Dev);
iic_W(Dev, Dev.ADD);
iic_WaitAck(Dev, 200);

View File

@@ -4,7 +4,7 @@
#define CS_ENABLE() Dev.CS ? Dev.CS_SET(HIGH) : Dev.CS_SET(LOW)
#define CS_DISABLE() Dev.CS ? Dev.CS_SET(LOW) : Dev.CS_SET(HIGH)
static inline uint8_t spi_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
static inline uint8_t spi_RW(SW_Dev_Spi Dev, uint8_t Write_Date) {
uint8_t i, read_date = 0;
switch (Dev.MODE) {
case Mode0:
@@ -67,7 +67,7 @@ static inline uint8_t spi_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
return read_date;
}
uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
uint8_t SW_SPI_RW(SW_Dev_Spi Dev, uint8_t Write_Date) {
uint8_t read_date;
CS_ENABLE();
read_date = spi_RW(Dev, Write_Date);
@@ -75,28 +75,28 @@ uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
return read_date;
}
void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len) {
void SW_SPI_WL(SW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len) {
CS_ENABLE();
for (uint32_t i = 0; i < Len; i++)
spi_RW(Dev, Write_Date[i]);
CS_DISABLE();
}
void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len) {
void SW_SPI_RL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len) {
CS_ENABLE();
for (uint32_t i = 0; i < Len; i++)
Read_Date[i] = spi_RW(Dev, 0xFF);
CS_DISABLE();
}
void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len) {
void SW_SPI_RWL(SW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len) {
CS_ENABLE();
for (uint32_t i = 0; i < Len; i++)
Read_Date[i] = spi_RW(Dev, Write_Date[i]);
CS_DISABLE();
}
uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date) {
uint16_t SW_SPI_RW16(SW_Dev_Spi Dev, uint16_t Write_Date) {
Data16 wdate16, rdate16;
wdate16.u16 = Write_Date;
CS_ENABLE();
@@ -111,7 +111,7 @@ uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date) {
return rdate16.u16;
}
void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
void SW_SPI_RL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
Data16 rdate16;
CS_ENABLE();
switch (Dev.ENDIAN) {
@@ -147,7 +147,7 @@ void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
CS_DISABLE();
}
void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
void SW_SPI_WL16(SW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
Data16 wdate16;
CS_ENABLE();
switch (Dev.ENDIAN) {
@@ -183,7 +183,7 @@ void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
CS_DISABLE();
}
void HW_SPI_RWL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len) {
void SW_SPI_RWL16(SW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len) {
Data16 wdate16, rdate16;
CS_ENABLE();
switch (Dev.ENDIAN) {

49
lib/src/target.c Normal file
View File

@@ -0,0 +1,49 @@
#include <errno.h>
#include <sys/time.h>
#include <target.h>
#include <stdint.h>
#if !defined(OS_USE_SEMIHOSTING)
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
UART_HandleTypeDef *gHuart;
void RetargetInit(UART_HandleTypeDef *huart) {
gHuart = huart;
/* Disable I/O buffering for STDOUT stream, so that
* chars are sent out as soon as they are printed. */
setvbuf(stdout, NULL, _IONBF, 0);
}
__attribute__((unused)) int _write(int fd, char *ptr, int len) {
HAL_StatusTypeDef hstatus;
if (fd == STDOUT_FILENO || fd == STDERR_FILENO) {
hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return len;
else
return EIO;
}
errno = EBADF;
return -1;
}
int _read(int fd, char *ptr, int len) {
HAL_StatusTypeDef hstatus;
if (fd == STDIN_FILENO) {
hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return 1;
else
return EIO;
}
errno = EBADF;
return -1;
}
#endif //#if !defined(OS_USE_SEMIHOSTING)

131
lib/src/task/task.c Normal file
View File

@@ -0,0 +1,131 @@
#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;
} else if (p->runcnt > 0) {
p->runcnt--;
}
if (p->callback) {
p->callback(p, p->userdata);
p->lasttime = platformTicksFunc() + p->intervaltime;
}
}
p = p->next;
}
return true;
}