https://github.com/lmooml/SmartTimer
SmartTimer可以应用在对实时性要求没那么高的场合,比如说一个空气检测装置,每 200ms 收集一次甲醛数据,这个任务显然对实时性要求没那么高,如果时间上相差几毫秒,甚至几十毫秒也没关系,那么使用SmartTimer非常适合。
而如果开发一个四轴飞行器,无论是对陀螺仪数据的采集、计算,以及对 4 个电机的控制,在时间的控制上都需要非常精确。那么这种场合下 SmartTimer无法胜任,你需要一个带有抢占优先级机制的实时系统。
不同的场景,选择不同的工具和架构才是最合理的,SmartTimer只能做它力所能及的事情。
用阻塞的,非精确的方式,就是用for(i=0;i<0xffff;i++);这种循环等待的方式,来非精确的延迟一段时间,然后再顺序执行下面的程序;
利用硬件定时器实现异步的精确延时,把 XXX 函数在定时器中断里执行;
第一是当单片机资源有限的时候,使用操作系统恐怕不太合适;
第二是学习操作系统本身有一定的难度,至少你需要花费一定的时间;
void stim_init ( void );
void stim_tick (void);
void stim_mainloop ( void );
int8_t stim_loop ( uint16_t delayms, void (*callback)(void), uint16_t times);
int8_t stim_runlater ( uint16_t delayms, void (*callback)(void));
void stim_delay ( uint16_t delayms);
void stim_kill_event(int8_t id);
void stim_remove_event(int8_t id);
C. 在主While循环中执行stim_mainloop(),这个函数主要有两个作用,一是执行定时结束后的回调函数;二是回收使用完毕的timer事件的资源。
stim_runlater
int8_t stim_runlater ( uint16_t delayms, void (*callback)(void));
timer_runlater(100,ledflash); //100豪秒(100*1ms=100ms)后,执行void ledflash(void)函数
timer_runlater(100,ledflash); //1秒(100*10ms=1000ms=1S)后,执行void ledflash(void)函数
stim_loop
int8_t stim_loop ( uint16_t delayms, void (*callback)(void), uint16_t times);
timer_runloop(50,ledflash,5); // 每50ms,执行一次ledflash(),总共执行5次
timer_runloop(80,ledflash, TIMER_LOOP_FOREVER); // 每80ms,执行一次ledflash(),无限循环。
函数 timer_delay
void timer_delay ( uint16_t delayms); //延迟xx ms
这个函数会阻塞主程序,并延迟一段时间。
void stim_kill_event(int8_t id);
void stim_remove_event(int8_t id);
void stim_kill_event(int8_t id); //直接取消事件,忽略未处理完成的调度任务。
void stim_remove_event(int8_t id);//将已经完成计时的调度任务处理完毕之后,再取消事件
SmartTimer可接受的Timer event 数量是有上限的,这个上限由smarttimer.h中的宏定义来决定的:
#define TIMEREVENT_MAX_SIZE 20
默认为20个,你可以根据实际情况增加或减少,但不可多于128 个。
END
来源:一起学嵌入式