使用STM32裸机实现时间轮片法进行多任务调度【单片机篇】

简介

 


代码

思路:在定时器中判断各个人物是否到执行时间,如果到了,该任务flag置1,然后主循环判断flag是否为1,为1执行。

#include "stm32f10x.h"                  // Device header

/*  使用时间片轮转的方法进行任务调度  */

//任务初始化结构
typedef struct
{
    uint8_t run_flag;
    uint8_t timer;		//计时器 
    uint16_t itv_time;		//interval 间隔时间 
    void (*task_handle)(void);
} Task_InitTypedef;

//任务清单
enum task_list
{
	TASK_xxx,    //自己随便起名,好辨别就行
	TASK_xxx,
	TASK_TOTAL
};

//时间片任务结构体
static Task_InitTypedef tasks[]=
{
	{0,80,200,要运行的函数名},
    {0,100,100,要运行的函数名},
};

/*****************************************************************************
* 功  能:任务执行节奏
* 参  数:
* 返回值:无
* 备  注:脉搏,时间片轮转
*****************************************************************************/
void Task_Rhythm(void)
{
    uint8_t i;
    for(i=0; i<TASK_TOTAL; i++)
    {
        if(tasks[i].timer)
        {
            tasks[i].timer--;
            if(0 == tasks[i].timer)
            {
                tasks[i].run_flag = 1;
            }
        }
    }
}

/*****************************************************************************
* 功  能:任务处理
* 参  数:
* 返回值:无
* 备  注:处理任务,时间片轮转
*****************************************************************************/
void Task_Schedule(void)
{
    uint8_t i;
    for(i=0; i<TASK_TOTAL; i++)
    {
        if(tasks[i].run_flag)
        {
            tasks[i].task_handle();
            tasks[i].run_flag=0;
            tasks[i].timer = tasks[i].itv_time;
        }
    }
}

1)以上是核心代码

2)任务清单中,使用的枚举,添加任务直接在TASK_TOTAL上面添加就行,枚举会自动递增,直接统计任务数

3)Task_Schedule函数直接扔进while循环就行

4)Task_Rhythm函数扔进定时器中


END~~

作者:叫我刘老刘

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32裸机实现时间轮片法进行多任务调度【单片机篇】

发表回复