使用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~~
作者:叫我刘老刘