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

.

/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/10331059.html