MCU时间计数系统结构(适合时间管理要求高的结构)

**

MCU时间计数系统结构

**

使用定时器运行函数,优点是能很好的管理每个函数时间定位,缺点是当mode函数出现死循环,容易出现死机

#include "SysClock.h"

volatile static u8 SYSCLOCK_timeFlg=0;
volatile static u32 SYSCLOCK_timeCnt=0;

const PFun TimedTaskQueue[Reserve_MODULE] = 
{
 FlashDtat_TaskManage,
 samplingGyr_TaskManage,
 samplingAcc_TaskManage,
 filterData_TaskManage,
 EKF_Data_TaskManage,
 UARTDATA_TaskManage,	
 feedback_TaskManage,
};

/*1ms系统时钟计数函数*/
void SysClock_1msFUNC(void)
{
	++SYSCLOCK_timeCnt;
	SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1MS);
	if(0u==(SYSCLOCK_timeCnt%10u))
	{
		SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_10MS);
	}
	if(0u==(SYSCLOCK_timeCnt%100u))
	{
		SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_100MS);
	}
	if(0u==(SYSCLOCK_timeCnt%1000u))
	{
		SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1S);
	}
	if(0u==(SYSCLOCK_timeCnt%60000u))
	{
		SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1MIN);
	}
}

/*获取计时标记*/
u8 SysClock_Getflg(u8 TimerType)
{
   u8 Flag = 0U;

    if (TimerType < TIMER_VALID_NUMBER)
    {
        Flag = (SYSCLOCK_timeFlg >> TimerType) & 0x01U;
        
        if (1U == Flag)
        {
            SYSCLOCK_timeFlg &= ~(1U << TimerType); /*读取后清除对应标记*/
        }
    }
    return Flag;
}

/*定时任务*/
void TimedTask(void)
{
    u8 TaskQueue = 0U;
    u8 TimerType = 0U;

    for (TimerType = 0U; TimerType < TIMER_VALID_NUMBER; TimerType++)
    {
        if (SET == SysClock_Getflg(TimerType))
        {
            TaskQueue = 0U;
            
            for (; TaskQueue < Reserve_MODULE; TaskQueue++)
            {
                if (NULL != TimedTaskQueue[TaskQueue])
                {
                    (*TimedTaskQueue[TaskQueue])(TimerType);
                }
            }
        }
    }
}

定义工程sysClock.h

#ifndef  SYSCLOCK_H
#define  SYSCLOCK_H

#include "gd32e23x.h"
#include "systick.h"
#include "string.h"

typedef uint8_t u8 ;
typedef uint16_t u16 ;
typedef uint32_t u32 ;

typedef void (*PFun)(unsigned char);

typedef enum
{
	SYSCLOCK_1MS = 0,
	SYSCLOCK_10MS,
	SYSCLOCK_100MS,
	SYSCLOCK_1S,
	SYSCLOCK_1MIN,
	TIMER_VALID_NUMBER,
}SYSCLOCK_TYPE;


typedef enum
{
	USART_MODULE,
	Reserve_MODULE,
}MODULE_TYPE;



void SysClock_1msFUNC(void);
void TimedTask(void);

#endif

在函数模块中轮询运行,例如UART打印模块UART.c

 static void UARTDATA_1MSTask(void);
 static void UARTDATA_10MSTask(void);
 static void UARTDATA_100MSTask(void);
 static void UARTDATA_1STask(void);


void UARTDATA_TaskManage(u8 TaskPeriod)
{
	switch (TaskPeriod)
	{
		case TIMER_1MS:
			UARTDATA_1MSTask();
		break;
		case TIMER_5MS:
			UARTDATA_10MSTask();
			break;
		case TIMER_10MS:
			UARTDATA_100MSTask();
			break;
		case TIMER_100MS:
			UARTDATA_1STask();
			break;
		default:break;
	}
}

static void UARTDATA_1MSTask(void)
{
   
}

static void UARTDATA_10MSTask(void)
{
   
}

static void UARTDATA_100MSTask(void)
{
   UART_data();
}

static void UARTDATA_1STask(void)
{
   
}

定时器中断1ms一个时钟

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void SysTick_Handler(void)
{
		SysClock_1msTime();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值