项目中小型单片机跑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;
/// <summary> /// 公用变量 /// </summary> static FueTd ftd;
/// <summary> /// 公用变量 /// </summary> /// <param name=""></param> /// <returns></returns> FueTd* InitFd(void) { ?? ?memset(&ftd, 0, sizeof(FueTd)); ?? ?ftd.state = 1; ?? ?return &ftd; }
/// <summary> /// 任务初始化 /// </summary> /// <param name=""></param> void Tsk_Init(void) { ?? ?if (Tm.state) ?? ?{ ?? ??? ?return; ?? ?} ?? ?memset(&Tm, 0, sizeof(TskModl)); ?? ?Tm.state = 1; }
/// <summary> /// 初始化任务 /// </summary> /// <returns></returns> static uint8_t InitTsk() { ?? ?if (!Tm.state) ?? ?{ ?? ??? ?Tsk_Init(); ?? ?} ?? ?if (Tm.Num >= tskNum) ?? ?{ ?? ??? ?return tskNum; ?? ?} ?? ?return 0; }
/// <summary> /// 添加任务所执行的任务为可等待,空为失败,否则为任务本身 /// </summary> /// <param name="fu"></param> /// <param name="d"></param> /// <returns></returns> 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; }
/// <summary> /// 添加任务所执行的任务为可等待,空为失败,否则为任务本身 /// </summary> /// <param name="d"></param> /// <returns></returns> 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; }
/// <summary> /// 所有任务一周期内执行一次,返回1的任务将被清除 /// </summary> /// <param name=""></param> 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++; ?? ?} } ?
|