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

关键代码摘要如下:

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

 #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语言之 面向对象+虚事务的抽象:针对多次同步失败的节能处理机制

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

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

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

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

最新文章

  1. C和指针 第三章 指针常量与常量指针
  2. PYTHON学习之路_PYTHON基础(1)
  3. cgroup隔离的知识点
  4. oracle11g+ef+vs2013做的项目在部署的时候碰到的问题
  5. HTML CSS基础(三)
  6. 软件工程(GZSD2015)第三次作业
  7. mybatis插入实体到数据库后获取自增的主键
  8. Macbook pro从购买服务器到搭建服务器环境(1)
  9. Codeforces Round 1152 (div. 2)
  10. Helm使用详解
  11. 20171026python读取txt写入csv
  12. this、new,容易混淆的地方
  13. java分解质因数,具体程序分析和代码
  14. Linux信号(signal)机制【转】
  15. js冲刺一下
  16. PHP垃圾回收机制防止内存溢出
  17. Beta 冲刺1
  18. JSP 上传文件
  19. C语言中文件目录(一正二反)斜杠
  20. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)

热门文章

  1. Fiddler添加显示ip和响应时间
  2. Serializers组件详解
  3. 服务发现Eureka、zookeeper、consul
  4. Android项目智能机器人的实现,带有源代码,图灵智能机器人,详细讲解。。
  5. Flutter Toast消息提示框插件
  6. jumpserver如何在远程时使用复制粘贴-windwos系统下
  7. SpringBoot整合Quartz及log4j实例
  8. 【小白学PyTorch】8 实战之MNIST小试牛刀
  9. Python之 最全 Conda、pip 管理环境和安装包、更换源、解决HttpError等一些列问题
  10. BasicInterpreter2 改进版,简化了print函数