码迷,mamicode.com
首页 > 其他好文 > 详细

定时更新一组状态

时间:2018-05-27 14:52:45      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:越界   实现   实现机制   IV   div   利用   oid   ++   计数   

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

实现机制为:

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

  具体实现为:以各状态更新周期为对象,对累加周期变量取余,以结果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而造成绝对误差。

 

定时更新一组状态

标签:越界   实现   实现机制   IV   div   利用   oid   ++   计数   

原文地址:https://www.cnblogs.com/skullboyer/p/9095830.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!