- #ifndef __SIMPLE_SOFT_TIME_H_
- #define __SIMPLE_SOFT_TIME_H_
-
-
- #define MIAO 1000ul
- #define MIN 60*MIAO
-
-
-
-
- #define UPLOAD_SENSOR_ITV 10*MIN //传感器数据上报间隔
- #define OFFLINE_WAIT_TIME 8*MIN
-
-
-
-
- typedef enum {
- ST_General_Ov=0,
- ST_HEAT_Ov, //1
- ST_M35_HEAT_OV, //2
- ST_Host_Delay, //3
- ST_GPS_Ov, //4
- ST_Register_Ov, //5
- ST_IDX_MAX
- }ST_IDX;
-
-
-
-
- void ScheduleSimpleTimer(void);
- void SetM35OverTime(ST_IDX idx, long overtime);
- int GetM35OvTime(ST_IDX idx);
- void KillSimpleTime(ST_IDX idx);
- void Init_SimpeTime(void);
- void LongTimeRun(void);
-
-
- #endif
复制代码
简单定时器
*************************/
#include "simplesofttime.h"
#include "common.h"
long m35overtime[ST_IDX_MAX];
void Init_SimpeTime(void)
{
ST_IDX i;
for(i=ST_M35_OV;i<ST_IDX_MAX;i++)
{
KillSimpleTime(i);
}
}
void SetM35OverTime(ST_IDX idx, long overtime)
{
if(idx>=ST_IDX_MAX)
{
while(1);
}
m35overtime[idx]=overtime/(1000/HZ);
}
//返回1表示超时了
int GetM35OvTime(ST_IDX idx)
{
if(m35overtime[idx]<0)
return 1;
return 0;
}
//这里只能简单的"杀掉"这个定时器
void KillSimpleTime(ST_IDX idx)
{
if(idx>=ST_IDX_MAX)
{
while(1);
}
m35overtime[idx]=((1ul<<31)-1); //2147483647*5ms=10737418s/3600=2982h/24=124day
}
/* 该函数5ms调用一次 */
void ScheduleSimpleTimer(void)
{
ST_IDX i;
for(i=ST_M35_OV;i<ST_IDX_MAX;i++)
{
m35overtime[ i]--;
}
}
//1天调用一次
void LongTimeRun(void)
{
ST_IDX i;
for(i=ST_M35_OV;i<ST_IDX_MAX;i++)
{
if(m35overtime[ i]>1e9)
{
m35overtime[ i]=((1ul<<31)-1);
}
}
}
main()函数的开始调用下Init_SimpeTime()函数将ScheduleSimpleTimer()函数放到中断频率为HZ的定时器里;
该软件定时器使用起来简单,效率高,最6的地方就是ST_IDX_MAX的使用,有了它,每次新增一个定时器就是在ST_IDX增加一条语句的事情;
如果不使用enum的里技巧,新增一个传感器恐怕至少得修改2处,而且偶尔还容易忘记.
|