裸机任务管理器

作用:

对当前系统的任务进行管理,优先级最高的将会被排列在第0位
通过一个U16 的ID进行区别
当系统需要执行任务时只要根据返回的ID即可知道需要做哪件事

.H

#ifndef  __PRIORITY_MANAGER_H
#define  __PRIORITY_MANAGER_H
typedef unsigned char 			uint8_t;
typedef unsigned short int 		uint16_t;
typedef unsigned int        	uint32_t;
 
//优先级划分
//优先级和ID都不能为0
//优先级从 1-65535  数字越大,优先级越高
//ID也是从 1到65535  
typedef enum{  //优先级等级示例
	LOW_PRI = 0,  //低优先级
	MID_PRI = 1,	//中等优先级
	HIGH_PRI = 2	//高优先级
}e_PRI;
typedef struct Task{
	uint16_t task_pri;  //任务优先级
	uint16_t Task_Id;	//任务ID
}s_Task;
#define  MAX_TASK_NUM 10   //此处宏定义最大的任务数量
typedef struct MANAGER{
	s_Task Task[MAX_TASK_NUM];   //任务数组
	uint16_t last;   //任务数量
}s_Pri_Manager;

//------使用前一定要先初始化------
void Init_Pri_Manager(void);  //初始化一个任务管理器

void Clear_all_Task(void);  //清空当前所有任务

uint16_t First_Task_ID(void);  //返回当前优先级最高的任务

uint8_t Reduce_Task(uint16_t ID);  //减少对应ID的任务

uint8_t Add_Task(uint16_t ID,uint16_t priority);  //增加一个任务

uint8_t Find_Task(uint16_t ID);  //查找是否存在对应ID的任务


#endif

.C

#include "priority_manager.h"
#include "String.h"
#include "stdio.h"

s_Pri_Manager Pri_manager;

#define  NULL_ID  0
#define  LOW_PRI  0

typedef uint16_t data_t;

//#define _DBUG	 //打印功能

/*  //采用快速排序对任务进行排列
选一个基数和最后一个值的比较;
如果基数较小,则交换位置;
再将基数与前面的数字进行比较

选择一个基数,进行分组,小于基数的放在左边,大于基数的放在右边
第二次进行拆分,把左边和右边再次进行排序
直到i和j相等
 **/
/*__--__--__--__--__--__非用户接口begin--__--__--__--__--__--__*/
int sort(s_Pri_Manager * data,int low,int high){
#ifdef _DBUG
	printf("into sort\n");
#endif
	data_t temp_pri;  //基数
	data_t temp_Id;
	temp_pri = data->Task[high].task_pri;   //选择一个基数
	temp_Id = data->Task[high].Task_Id;
	
	while(low<high){
		while(low < high && temp_pri <= data->Task[low].task_pri){  //把大于基数的放在基数右边
			low++;
		}
		data->Task[high].task_pri = data->Task[low].task_pri;  //把小的放前面
		data->Task[high].Task_Id  = data->Task[low].Task_Id;
		
		while(low < high && temp_pri >= data->Task[high].task_pri){ //把小于基数的放在基数左边
			high--;

		}
		data->Task[low].task_pri = data->Task[high].task_pri;  
		data->Task[low].Task_Id = data->Task[high].Task_Id;
	}
	data->Task[high].task_pri = temp_pri;  //最后把基数放在中间的位置
	data->Task[high].Task_Id = temp_Id;
	return high;
}

/*
快速排序
*/
int quick_sort(s_Pri_Manager * data,int low,int high){
#ifdef _DBUG
	printf("into quick_sort \n");
#endif
	int temp;  //基数
	int i;
	int j=-1;
	if(low == high){
		return 0;
	}	
	for(i=low;i<=high;i++){  //打印一下数组成员
#ifdef _DBUG
		printf("%d",data->Task[i].Task_Id);
#endif	
		if(data->Task[i].Task_Id == 0){;} //判断数组成员个数
		else{
			j++;
		}
	}
	if(j == -1 || j == 0){return 0;}  //如果j没有被++,说明数组全是0,或者数组个数低于两个

	temp = sort(data,low,high);  //第一次排序
	quick_sort(data,low,temp-1);  //基数左边的排序
	quick_sort(data,temp+1,high);  //基数右边的排序
	
	return 0;
}
/*__--__--___---___---___非用户接口end---___---___---___---__*/

void Init_Pri_Manager(void){
	uint8_t i =0;
	for(i = 0;i<MAX_TASK_NUM;i++){
		Pri_manager.Task[i].Task_Id = NULL_ID;
		Pri_manager.Task[i].task_pri = LOW_PRI;
		Pri_manager.last = 0;
	}
	#ifdef _DBUG
	printf("初始化任务管理器\n");
	#endif
}

void Clear_all_Task(void){
	uint8_t i =0;
	for(i = 0;i<MAX_TASK_NUM;i++){
		Pri_manager.Task[i].Task_Id = NULL_ID;
		Pri_manager.Task[i].task_pri = LOW_PRI;
		Pri_manager.last = 0;
	}
	#ifdef _DBUG
	printf("清除全部任务\n");
	#endif
}
/*
 @bref 根据优先级增加一个任务
*/
uint8_t Add_Task(uint16_t ID,uint16_t priority){
	uint8_t i =0;
	if(Pri_manager.last < MAX_TASK_NUM){  //查找是否还有空余
		for(i= 0;i<Pri_manager.last;i++){
			if(Pri_manager.Task[i].Task_Id == ID){  //查找相同ID
				Pri_manager.Task[i].task_pri = priority;  //更新优先级
				return 0;
			}
		}
		if((priority != LOW_PRI)&&(ID != NULL_ID)){  //优先级和ID都不能为0
				Pri_manager.Task[Pri_manager.last].Task_Id = ID;
				Pri_manager.Task[Pri_manager.last].task_pri = priority;
				Pri_manager.last++;
				//放入最后一位,然后快排
				quick_sort(&Pri_manager,0,Pri_manager.last-1);
				#ifdef _DBUG
				printf("----新增任务%d--PRI:%d\n",ID,priority);
				#endif
		}
	}
	return 1;
}
/*
 @bref 返回最高优先级的任务ID
*/
uint16_t First_Task_ID(void){
	return Pri_manager.Task[0].Task_Id;
}
/*
 把已经完成的任务从任务管理器中去除
 有可能不是最高优先级的任务
*/
uint8_t Reduce_Task(uint16_t ID){
	uint16_t i = 0;
	uint16_t j = 0;
	if(Pri_manager.last != 0){
		//查看是不是最高优先级的任务
		if(Pri_manager.Task[0].Task_Id != ID){
			for(j= 1;j<Pri_manager.last;j++){
				if(Pri_manager.Task[j].Task_Id == ID){
					break;
				}
			}
		}
		if(j < Pri_manager.last){
			for(i= j;i<Pri_manager.last;i++){
					Pri_manager.Task[i].Task_Id = Pri_manager.Task[i+1].Task_Id;
					Pri_manager.Task[i].task_pri = Pri_manager.Task[i+1].task_pri;
			}
				Pri_manager.last --;
			#ifdef _DBUG
			printf("----减少任务%d",ID);
			#endif
			return 1;
		}
	}
	return 0;
}
/*
查找任务,找到返回1,否则返回0
*/
uint8_t Find_Task(uint16_t ID){
	uint16_t j = 0;
	for(j= 0;j<Pri_manager.last;j++){
		if(Pri_manager.Task[j].Task_Id == ID){
			return 1;
		}
	}
	return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞百出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值