简易软件定时器
- 在做项目时,之前使用的软件定时器会偶现不能触发的问题
- 所以
- 改写一个简易的软件定时器代替
- 因为项目应用逻辑简单,个数较少
- 如使用的场景丰富,故功能达不到要求
- 先暂时记录一下
- 后续会整理一个完善功能,
- 代码如下
#include "user_time_tick.h"
USER_TICK_T USER_TICK[USER_TICK_NUM];
TIME_WORK_T USER_WORK;
void user_time_init(void)
{
uint8_t xdata num=0;
for(num=0;num<USER_TICK_NUM;num++)
{
USER_TICK[num].time_tick = TICK_STOP;
USER_TICK[num].time_tick_compare = TICK_STOP;
USER_TICK[num].time_tick_flag = false;
}
}
void user_time_start(uint8_t t, uint16_t time_t)
{
USER_TICK[t].time_tick = TICK_START;
USER_TICK[t].time_tick_compare = time_t;
}
void user_time_stop(uint8_t t)
{
USER_TICK[t].time_tick = TICK_STOP;
USER_TICK[t].time_tick_compare = TICK_STOP;
}
uint8_t user_time_busy(void)
{
uint8_t xdata num=0;
for(num=0;num<USER_TICK_NUM;num++)
{
if(USER_TICK[num].time_tick != TICK_STOP)
{
return true;
}
}
return false;
}
void user_time_handler(void)
{
uint8_t xdata num=0;
for(num=0;num<USER_TICK_NUM;num++)
{
if( USER_TICK[num].time_tick > USER_TICK[num].time_tick_compare )
{
USER_TICK[num].time_tick = TICK_STOP;
USER_TICK[num].time_tick_compare = TICK_STOP;
USER_TICK[num].time_tick_flag = true;
}
}
if( USER_TICK[TICK_KEY].time_tick_flag == true)
{
USER_TICK[TICK_KEY].time_tick_flag = false;
debug_printf("K\r\n");
key_detection_handler();
}
if( USER_TICK[TICK_SEND_TIME].time_tick_flag == true)
{
USER_TICK[TICK_SEND_TIME].time_tick_flag = false;
debug_printf("S\r\n");
gst_rf_resend_timeout_timer_handler();
}
if( USER_TICK[TICK_WAIT_WINDOWS].time_tick_flag == true)
{
USER_TICK[TICK_WAIT_WINDOWS].time_tick_flag = false;
debug_printf("W\r\n");
gst_rf_windows_timeout_timer_handler();
}
}
#ifndef __USER_TIME_TICK_H
#define __USER_TIME_TICK_H
#include "main.h"
#define USER_TICK_NUM 5
typedef enum
{
TICK_KEY = 0,
TICK_SEND_TIME = 1,
TICK_WAIT_WINDOWS = 2
};
typedef enum
{
TICK_START = 0,
TICK_STOP = 0xFFFF
};
typedef struct {
uint16_t time_tick;
uint16_t time_tick_compare;
uint8_t time_tick_flag;
}USER_TICK_T;
typedef struct{
uint8_t time_work_num;
uint8_t time_work_num_save;
}TIME_WORK_T;
extern USER_TICK_T USER_TICK[USER_TICK_NUM];
void user_time_init(void);
void user_time_start(uint8_t t, uint16_t time_t);
void user_time_stop(uint8_t t);
void user_time_handler(void);
uint8_t user_time_busy(void);
#endif
for(num=0;num<USER_TICK_NUM;num++)
{
if( USER_TICK[num].time_tick != TICK_STOP)
{
USER_TICK[num].time_tick++;
if ( USER_TICK[num].time_tick >= 65500)
{
USER_TICK[num].time_tick =0;
}
}
}