MCU裸机定时多任务实现

在51等一些低性能、资源有限的MCU中很少有能够使用的RTOS实时操作系统,但是我们又想用多任务的思想去完成开发时就会想到使用定时任务去完成,于是手搓了一个简单的多任务框架,在F103中完成验证,其它mcu更换定时器初始化部分并在中断中调用即可使用。上代码

//.h文件
#ifndef __TIMER_H__
#define __TIMER_H__

#include <stdio.h>
#include <stdint.h>

typedef struct tmrDefinition{
	uint32_t cnt;//当前累计的单位时间
	uint32_t cycle;//周期时间(多少个单位时间)
	int32_t times;//执行次数(-1表示一直执行)
	int32_t times_tmp;
	void (*tmr_callBack_t)(void *);//执行的函数
	void *para;//函数的参数
	uint8_t on_off;//启停标识
	struct tmrDefinition *next;//指向下一个链节
}timerTypeDef;



//初始化
void User_Timer_Init( void );

//创建用户定时任务		  对象									周期						次数						执行函数						传递参数
void User_Tmr_Create(timerTypeDef *timer_t,uint32_t cycle,int32_t times,void (*tmr_Back_t)(void *),void *para);

//启动初始化过后的任务
void User_Tmr_Start( timerTypeDef *timer_t );

//停止存在的任务
void User_Tmr_Stop( timerTypeDef *timer_t );

//删除存在的任务
void User_Tmr_Del( timerTypeDef *timer_t );

//复位当前任务计数和计时
void User_Tmr_Reset( timerTypeDef *timer_t );

//获取当前任务剩余执行次数
int32_t User_Tmr_Get_Times( timerTypeDef *timer_t );


#endif

//.c文件
#include "timer.h"
#include "tim.h"

timerTypeDef *timer_head = NULL;
void User_TIM_Callback( void );


//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//初始化
void User_Timer_Init( void )
{
	/*添加系统定时器初始化部分*/
	MX_TIM1_Init();
	HAL_TIM_Base_Start_IT(&htim1);
}
//定时器启动
void TimerStart( void )
{
	HAL_TIM_Base_Start_IT(&htim1);
}
//定时器关闭
void TimerStop( void )
{
	HAL_TIM_Base_Stop_IT(&htim1);
}
//重写的定时器中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{//这里只使用一个定时器,不需要判断是哪个定时器产生的中断
	User_TIM_Callback();
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



//该函数在定时器中断中调用
void User_TIM_Callback( void )
{
		TimerStop();
		timerTypeDef *timer_chain_t = timer_head;
		while( timer_chain_t != NULL )
		{
				if( timer_chain_t->on_off == 1 )
				{
					++timer_chain_t->cnt;
					if( timer_chain_t->cnt >= timer_chain_t->cycle )
					{
						timer_chain_t->cnt = 0;
						
						if( timer_chain_t->times==-1 || timer_chain_t->times>0 )
						{
							if( timer_chain_t->times > 0 )
							{
								timer_chain_t->times--;
								if( timer_chain_t->times == 0 )
								{
									timer_chain_t->on_off = 0;
									//timer_chain_t->times = timer_chain_t->times_tmp;
								}
							}
							//TimerStop();
							timer_chain_t->tmr_callBack_t(timer_chain_t->para);
							//TimerStart();
						}
					}
				}

				timer_chain_t = timer_chain_t->next;
		}
		TimerStart();
}

//创建用户定时任务		  对象									周期						次数						执行函数						传递参数
void User_Tmr_Create(timerTypeDef *timer_t,uint32_t cycle,int32_t times,void (*tmr_Back_t)(void *),void *para)
{
	timer_t->cnt = 0;
	timer_t->cycle = cycle;
	timer_t->times = times;
	timer_t->times_tmp = times;
	timer_t->tmr_callBack_t = tmr_Back_t;
	timer_t->para = para;
	timer_t->on_off = 0;
	timer_t->next = NULL;
	
	//插入链表
	timerTypeDef *timer_chain_t = timer_head;
	if( timer_head == NULL )
	{
		timer_head = timer_t;
	}else{
		while( timer_chain_t->next != NULL )
		{
			timer_chain_t = timer_chain_t->next;
		}
		timer_chain_t->next = timer_t;
	}
}
//启动初始化过后的任务
void User_Tmr_Start( timerTypeDef *timer_t )
{
	timer_t->on_off = 1;
}
//停止存在的任务
void User_Tmr_Stop( timerTypeDef *timer_t )
{
	timer_t->on_off = 0;
}
//删除存在的任务
void User_Tmr_Del( timerTypeDef *timer_t )
{
	timerTypeDef *timer_chain_t = timer_head;
	timer_t->on_off = 0;
	if( timer_head == timer_t )
	{
			timer_head = timer_t->next;
			timer_t->next = NULL;
	}else{
		while( timer_chain_t != NULL )
		{
			if( timer_chain_t->next == timer_t )
			{
					timer_chain_t->next = timer_t->next;
					timer_t->next = NULL;
			}
			timer_chain_t = timer_chain_t->next;
		}
	}
}
//复位当前任务计数和计时
void User_Tmr_Reset( timerTypeDef *timer_t )
{
	timer_t->cnt = 0;
	timer_t->times = timer_t->times_tmp;
}
//获取当前任务剩余执行次数
int32_t User_Tmr_Get_Times( timerTypeDef *timer_t )
{
	return timer_t->times;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值