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
.