zoukankan      html  css  js  c++  java
  • C语言普通写法实现:针对多次同步失败的节能处理机制

    程序不美, 不来一一整理了。 以后有时间可以把这个功能封装为一个类的对象来操作。即使不封装为类,至少也该封装为一个独立的函数吧。。。

    关键代码摘要如下:

    无线同步信号发射端,每分钟发一次,每次发射的时间点(秒值、甚至毫秒值)都是固定的。

     #define    REVISE_TIME   (300-13)
    
     
    
    if( GetSecFlag(bit0) ) // 秒标志
    {
    static u16 SyncCntforNormalMode = 0; // SyncCntforNormalMode 常规的同步计时  该值的最大值是REVISE_TIME
    static u32 SyncCntforErrMode = 0;       // sG_Global.SyncCntforErr 用于获取是否同步异常
    static u8 SyncFail_Times = 0;
    
      ClrSecFlag(bit0);
      SyncCntforErrMode++;  
    // 下一次同步的开启点,应该在上一次成功同步后的5分钟-13秒。
    
    // 同步事件,记为事件A :同步超时,唤醒一次
    if( sG_Global.syncState==ST_SYNC_OK )
    {
      SyncFail_Times=0;
    if(++SyncCntforNormalMode> REVISE_TIME )
    {
      SyncCntforNormalMode = 0; 
      sG_Global.syncState = ST_SYNC_NULL; // 由已同步状态切出去
      WirelessWakeUp(62);                          // 同时,打开设备,进行一次同步
      SyncCntforErrMode = 0; 
    }
    }
    
    
    if(SyncFail_Times<= 2)// 失败3次以内
    {
      if( SyncCntforErrMode>= ( REVISE_TIME+120+13 ) ) // 这里应该是REVISE_TIME + 13 + 120 .这里不明白可以下图中的绿色文字。
      {                                                                        // 偏移周期肯定是每分钟的整数倍的
      SyncFail_Times++;
      SyncCntforErrMode = 0;
      WirelessWakeUp(62); // 0 1 2 即大约7*3 = 21分钟
      }
    }
    else // 下面是针对多次同步失败的节能处理:改为1小时去同步一次。
    {
      if(SyncCntforErrMode>= 3600)   // 60分钟
      {
      SyncFail_Times++;
      SyncCntforErrMode = 0;
      WirelessWakeUp(62); 
      if(SyncFail_Times>100) // 100次 .中的后97次是1小时一次。所以一个周期:100次同步失败的总时间是97小时+大概21分钟左右了。
      SyncFail_Times = 0;      // 再回到下一个周期: 前3次同步失败, 失败后的420秒即每七分钟再同步一次。
      }
    }
    
    }

    优劣小结:

          这套代码实现了一个无线模块的同步功能:包括正常同步、同步失败增补、多次同步失败时同步周期转为一小时一次。三个功能。这套代码,只要曾经同步过一次,以后每次唤醒的秒值时刻都是相同的。

         本代码依据比较强的逻辑能力,实际要搞清楚全部细节,看是要花点时间的(例如需要看懂我上图中绿色文字那几句话)。

         实现的要点:对同一个变量,赋予了两重的功能。

                        SyncCntforNormalMode每次同步后要开始计时,时间到了要wakeup无线模块,这是职责一:周期性同步。

             同时,SyncCntforNormalMode还要负责周期性杀死异常计数器SyncCntforErrMode。这是职责二:   通知异常。

             这不符合专一职责要求,本程序不好理解的地方就在这里,实现的主要依据也是基于这个。所以,本程序上升不到高度,难以复用。

          评价:实现了功能,看去简洁。

          那么如果一块板子上有多块无线模块呢?我们怎么处理合适?

          复制黏贴,把所有的逻辑代码和相关变量重新搞一遍?显然是不合适的,那样的代码是一个低级水平,不实用又难看。所以,这里的代码没有达到复用的目的。而要达到代码复用,这是一个大话题,甚至有专门介绍代码复用的厚厚的书籍。我没看过,我知道一些原理:需要走近面向对象编程、观察事物(实物 和 虚事务)、提炼(提炼功能)、总结(总结它们的特征和它们的各个功能之间的关系),这个过程实现为代码,就可以达到抽象(把一类实物或者虚事务抽象出来),抽象有利于复用。

         请看下一节:

          C语言之 面向对象+虚事务的抽象:针对多次同步失败的节能处理机制

          (这种写法像寸拳,一上来搞一堆变量,这点没几行的东西是我七八个月前些的代码,我花了一整天时间才重新看明白看透,又整理重命名了一些变量名,使其带有更直观的物理意义,上传到博客。

          寸拳,刚劲有力,出击快速,但是没有章法可寻。

          下一集,我讲化寸拳为太极拳,按照常规思维,使编程有章法可寻,才能以不变去应对变化

          只有那样,我在面对新的未知业务的时候,我心里能有常规的应对策略可使。)

        面向对象优化版本:

        https://www.cnblogs.com/happybirthdaytoyou/p/10350420.html

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    【convertio.co】免费在线文档转化神器
    成长需熬过“四苦”
    岁月饶过谁
    致我的未来
    一定要相信自己
    奋斗的意义是什么?
    一生一世一双人,半醉半醒半浮生
    逆境中的自己
    怎样才能让人看到你呢
    2020 遇见更好的自己
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/10331059.html
Copyright © 2011-2022 走看看