项目中小型单片机跑RTOS觉得有点大,自已整了一个轻量级的,感觉用的挺爽,分享给大家
#include "Tsk.h"
#include "main.h"
//最大任务数量
#define tskNum 32
typedef struct TskModl
{
volatile uint8_t Num;
FueTd d[tskNum];
uint8_t state;
}TskModl;
static TskModl Tm;
///
/// 公用变量
///
static FueTd ftd;
///
/// 公用变量
///
///
///
FueTd* InitFd(void)
{
memset(&ftd, 0, sizeof(FueTd));
ftd.state = 1;
return &ftd;
}
///
/// 任务初始化
///
///
void Tsk_Init(void)
{
if (Tm.state)
{
return;
}
memset(&Tm, 0, sizeof(TskModl));
Tm.state = 1;
}
///
/// 初始化任务
///
///
static uint8_t InitTsk()
{
if (!Tm.state)
{
Tsk_Init();
}
if (Tm.Num >= tskNum)
{
return tskNum;
}
return 0;
}
///
/// 添加任务所执行的任务为可等待,空为失败,否则为任务本身
///
///
///
///
void* TskAdd(void* fu, void* d)
{
if (InitTsk())
{
return 0;
}
int i = 0;
FueTd* f = 0;
while (i < tskNum)
{
f = &Tm.d[i];
if (!f->state)
{
if (d)
{
f->fues = fu;
f->d = d;
}
else
{
f->fue = fu;
}
f->state = 1;
Tm.Num++;
return f;
}
i++;
}
return NULL;
}
///
/// 添加任务所执行的任务为可等待,空为失败,否则为任务本身
///
///
///
void* Tsk_Add(FueTd* d)
{
if (InitTsk())
{
return 0;
}
int i = 0;
FueTd* f = 0;
while (i < tskNum)
{
f = &Tm.d[i];
if (!f->state)
{
memcpy(f, d, sizeof(FueTd));
if (!f->state)
{
f->state = 1;
}
if (!f->tim && f->setTim)
{
f->tim = HAL_GetTick() + f->setTim;
}
Tm.Num++;
return f;
}
i++;
}
return 0;
}
///
/// 所有任务一周期内执行一次,返回1的任务将被清除
///
///
void To_Tsk(void)
{
int i = 0;
int num = Tm.Num;
FueTd* f;
uint32_t tik = HAL_GetTick(),
state = 0;
while (num > 0 && i < tskNum)
{
f = &Tm.d[i];
if (f->state)
{
if (f->tim < tik)
{
if (f->fues)
{
state = f->fues(f);
}
else
{
if (f->fue)
{
state = f->fue();
}
else
{
f->state = 0;
}
}
if (!state)
{
memset(f, 0, sizeof(FueTd));
Tm.Num--;
}
else
{
if (f->setTim)
{
f->tim = tik + f->setTim;
}
}
}
num--;
}
i++;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)