时间片轮询架构

本文介绍了在STM32嵌入式硬件中使用时间片轮询架构的详细过程,通过`TimeSlicePolling.h`和`TimeSlicePolling.c`两个关键文件,阐述了如何实现任务之间的公平调度和系统资源的有效利用。
摘要由CSDN通过智能技术生成

原文链接:https://blog.csdn.net/weixin_44576486/article/details/108908613?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22108908613%22%2C%22source%22%3A%22qq_45809384%22%7D&ctrtid=0kokB

TimeSlicePolling.h

#ifndef __TIMESLICEPOLLING_H
#define __TIMESLICEPOLLING_H

#include "sys.h"
#include "usart.h"  

/******************************************************************************************************
*定时器任务处理函数
*@param 
*******************************************************************************************************/
#define TASK_NUM	 3      	 //任务数 
//任务结构
typedef struct _TASK_COMPONETS
{
	u8 Run ;            						//程序运行标记
	u16 Timer;           						//定时器
	u16 ItvTime;           					//任务运行间隔
	void ( *TaskHook )(void) ;      //要运行的任务结构
} TASK_COMPONETS ;               	//任务组合
//任务清单
typedef enum _TASK_LIST
{
	TASK_TEST1 ,     //按键扫描
	TASK_TEST2 ,    //串口接收  
	TASK_TEST3 , 	//LED翻转
} TASK_LIST;

//任务函数
void Task_Test1( void ) ;      
void Task_Test2( void ) ;
void Task_Test3( void );

//定义任务结构体变量
extern TASK_COMPONETS TaskComps[TASK_NUM] ;

//任务处理函数
void Task_Process(void  ) ;
void Task_timer(void ) ; 
void TaskProcess(void);

#endif

TimeSlicePolling.c

#include “TimeSlicePolling.h”


/******************************************************************************************************
*定时器任务处理函数
*@param 
*******************************************************************************************************/
void Task_Test1(void ) 
{
	u2_printf(" test=1!\r\n");
}
void Task_Test2( void ) 
{
	u2_printf(" test=2!\r\n");
}
void Task_Test3( void )
{
	u2_printf(" test=3!\r\n");
}

//定义任务结构体变量
TASK_COMPONETS TaskComps[TASK_NUM] =
{ 
	{ 0, 	 2 ,   2 , 			Task_Test1 },
	{ 0, 	 2 ,   2 , 			Task_Test2 },
	{ 0,	 10 ,	 10 , 		Task_Test3 }
};

/**************************************************************************************
* FunctionName   : Task_Process()
* Description   	    : 任务处理
**************************************************************************************/
void Task_Process(void ) 
{
	u8 i = 0 ;
	for( i = 0 ; i < TASK_NUM ; i++ )
  {
		if( TaskComps[i].Run)   //不为0
		{
			TaskComps[i].Run = 0 ;       //标志清0
			TaskComps[i].TaskHook();   //运行函数
		}
	}
}

/**************************************************************************************
* FunctionName   : TaskRemarks()
* Description    : 任务标志处理
* EntryParameter : None
* ReturnValue    : None
* attention      : ***在定时器中断中调用此函数即可***
**************************************************************************************/ 
void Task_timer(void )
{
	u8 i;
	for (i=0; i<TASK_NUM; i++)          // 逐个任务时间处理
	{
		if (TaskComps[i].Timer)          // 时间不为0
		{
			TaskComps[i].Timer--;         // 减去一个节拍
			if (TaskComps[i].Timer == 0)       // 时间减完了
			{
				TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢复计时器值,从新下一次
				TaskComps[i].Run = 1;           // 任务可以运行
			}
		}
  }
} 
/**************************************************************************************
* FunctionName   : TaskProcess()
* Description    : 任务处理|判断什么时候该执行那一个任务
* EntryParameter : None
* ReturnValue    : None
* * attention      : ***放在mian的while(1)即可***
**************************************************************************************/
void TaskProcess(void)
{
    u8 i;

    for (i=0; i<TASK_NUM; i++)           // 逐个任务时间处理
    {
         if (TaskComps[i].Run)           // 时间不为0
        {
             TaskComps[i].TaskHook();         // 运行任务
             TaskComps[i].Run = 0;          // 标志清0
        }
    }   
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值