• 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

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    乱谈数学--傅里叶变换(级数)的原理(一)
    Linux day03
    Linux day02
    Linux day01(二)虚拟机快照和克隆的用法介绍
    Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接
    Django day 38 结算中心,支付中心,计算价格方法
    Django day 37 网站视频的播放,购物车接口,优惠券表分析
    Django day 36 支付宝支付,微信推送
    Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
    Django day 34 过滤课程,登录,redis,python操作redis
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/10331059.html
Copyright © 2020-2023  润新知