基于定时器和sys的任务调度

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值