一种定时更新一组状态的方法

定时更新一组状态一般用于状态机运行的判定条件

实现机制为:

  利用一硬件定时器作为时基,该时基选取适合状态更新频率,以该时基为累加周期,待累加周期变量值满足各状态更新周期时更新各状态。

  具体实现为:以各状态更新周期为对象,对累加周期变量取余,以结果0为依据更新各状态,累加周期变量清0依据为各状态更新周期的最小公倍数,不放任累加周期变量在其类型范围边界处自动清零,就是避免在范围边界处清0带来的绝对误差

 

示例

    更新状态      更新周期

    status1       100ms

    status2       200ms

    status3       1s

    status4       5s

    status5       1min

    status6       1hour

示意代码如下

 1 #define  T_PERIOD          10        /* 10ms */
 2 
 3 
 4 unsigned char status1=0, status2=0, status3=0, status4=0, status5=0, status6=0;
 5 
 6 unsigned int timer10ms_count =0;
 7 
 8 /* 设置定时器周期 */
 9 set_timer_period(T_PERIOD);
10 
11 /* 定时器计时到时的处理函数 */
12 void timer_handler()
13 {
14     timer10ms_count ++;
15 
16     if(0 == (timer10ms_count  %10))
17     {
18         status1 =1;
19     }
20     
21     if(0 == (timer10ms_count  %20))
22     {
23         status2 =1;
24     }
25     
26     if(0 == (timer10ms_count  %100))
27     {
28         status3 =1;
29     }
30     
31     if(0 == (timer10ms_count  %100*5))
32     {
33         status4 =1;
34     }
35     
36     if(0 == (timer10ms_count  %100*60))
37     {
38         status5 =1;
39     }
40     
41     if(0 == (timer10ms_count  %100*3600))
42     {
43         status6 =1;
44     }
45     
46     /* 待满足最小公倍数归零 */
47     if(3600 == timer10ms_count)
48     {
49         timer10ms_count =0;
50     }
51 }

范围边界处清0带来的绝对误差:

  上边代码中累加周期变量 timer10ms_count 类型为 unsigned int 其取值范围 [0, 4_294_967_295], 取值范围内1hour计时的次数:4,294,967,295 / 3,600 =1,193,046.47083...,timer10ms_count 计数到边界时即 3,600 *1,193,046 =4,294,965,600距越界还有1695个计数,但这已不够1hour计时数3600,所以待 timer10ms_count 计数到边界值 4_294_967_295 处归0,由于这1695个计数不满足1hour计时数3600而造成绝对误差。

 

posted @ 2018-05-27 13:18  壹点灵异  阅读(255)  评论(0编辑  收藏  举报