wenbo2005.online

学习记录 / STM32

拟任务调度系统

STM322026-01-24

实例:

uint8_t task_num=0;            //任务序列号
uint8_t led_ctrl;

//调度结构体
typedef struct{
    void (*func) (void);        //任务函数
    uint32_t rast_time;        //运行周期ms
    uint32_t last_run;        //上次运行时间

}Task_t;

//被调度的函数
void LED_proc()
{

    led_ctrl^=0x01;
    LED_Display(led_ctrl);
}

//任务列表
static Task_t Scheduler_Task[]=
{
    {LED_proc,200,0}
    //这里有众多任务
};

//任务初始化函数
void Scheduler_Init()
{
    task_num = sizeof(Scheduler_Task)/sizeof(Task_t);//获取任务个数
}

//任务运行函数
void Scheduler_Run()
{
    for(uint8_t i=0;i<task_num;i++)
    {
        uint32_t now_time = uwTick;
        if(now_time >= Scheduler_Task[i].rast_time + Scheduler_Task[i].last_run)
        {
            Scheduler_Task[i].last_run = now_time;

            Scheduler_Task[i].func();
        }
    }
}

void LED_Display(uint8_t Pin)
{
    HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,Pin<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}