task.c
#include "task.h"
/******************************************************************************
函数说明:用于在计时中 写入标志位
入口数据:无
返回值: 无
位置 : 放在1ms的定时器中断
******************************************************************************/
void TaskSchedule(void)
{
for(uint8_t i=0;i<Task_NUM_MAX;i++)
{
if(TaskComps[i].TimCount)
{
TaskComps[i].TimCount--;
if(TaskComps[i].TimCount==0)
{
/* 时间片为1 */
TaskComps[i].TimCount=TaskComps[i].TimRload; //重新装载
TaskComps[i].run=1;
}
}
}
};
/******************************************************************************
函数说明:任务处理函数
入口数据:无
返回值: 无
位置 : 放在main()中的 while(1) 里面
******************************************************************************/
void TaskHandler(void)
{
for(uint8_t i=0;i<Task_NUM_MAX;i++)
{
if(TaskComps[i].run)
{
TaskComps[i].run=0; //标记清零
TaskComps[i].TaskFuncCb(); //执行具体任务
}
}
}
// 用sys做任务调度的时间基准
/*
systick.c代码:
static void(*pTaskScheduleFunc)(void); //指向void函数指针的全局变量
void TaskScheduleCbReg(void (*pFunc)(void)) //注册一个回调函数 ,切换中断时执行什么函数的函数
{
pTaskScheduleFunc= pFunc;
}
void SysTick_Hahdler(void) //sys定时器中断,调用pTaskScheduleFunc函数
{
pTaskScheduleFunc();
}
main: 代码
int main(void)
{
TaskScheduleCbReg(TaskSchedule); //定时器中断执行TaskSchedule函数
while (1)
{
TaskHandler
}
}
*/
task.h
#ifndef __Task_H__
#define __Task_H__
//*****************************简单的任务调度器************************//
/* USER CODE BEGIN Includes */
#include "main.h"
#include "dht11.h"
/* USER CODE END Includes */
#define Task_NUM_MAX 1 //创建的任务数量
// 用于存储任务信息
typedef struct
{
uint8_t run; //任务调度标志 1:调度 0:挂起
uint16_t TimCount; //时间片周期,用于递减计数
uint16_t TimRload; //时间片周期,用于重载 - > 时间长度
void (*TaskFuncCb)(void); //函数指针,保存任务函数地址
}TaskComps_t;
// 添加任务的信息
// 运行状态—计数值—时间片间隔—任务函数
static TaskComps_t TaskComps[]=
{
// {0,500,500,SensorTask},
{0,500,500,DHT11}
/* Add new task here */
};
void TaskHandler(void);
void TaskSchedule(void);
#endif