轻量级微型裸机任务调度组件

轻量级微型裸机任务调度组件,第1张

轻量级微型裸机任务调度组件

项目中小型单片机跑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++;
    }
}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5650340.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存