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

关键代码摘要如下:

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

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

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

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

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

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

C语言普通写法实现:针对多次同步失败的节能处理机制的更多相关文章

  1. JAVA语言规范-线程和锁章节之同步、等待和通知

    JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...

  2. 《Go语言实战》笔记之协程同步 sync.WaitGroup

    原文地址(欢迎互换友链): http://www.niu12.com/article/8 sync 包提供同步 goroutine 的功能 <p>文档介绍</p><cod ...

  3. 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

    各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...

  4. 向properties文件中写入信息(针对获取properties文件失败的总结)

    前段时间项目需要将某个属性动态的写入项目发布路径下的properties文件中;但是实际发布时发现找不到maven项目resource路径下的project.properties文件,调试多次代码如下 ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_1_线程状态概述

    Thread中有个嵌套类 它描述了线程的状态 线程状态的图 Object类中的Wait方法和notify方法

  6. go语言从例子开始之Example24.通道同步

    我们可以使用通道来同步 Go 协程间的执行状态.这里是一个使用阻塞的接受方式来等待一个 Go 协程的运行结束. Example: package main import "fmt" ...

  7. puppet(4)-类、模版语言、模块

    puppet(4)-类.模版语言.模块 代码重用: class, module 类 类的简单说明 类是用于公共目的的一组资源,是命名的代码块,创建后可在puppet全局进行调用,类可以继承类是我们构建 ...

  8. tornado框架&三层架构&MVC&MTV&模板语言&cookie&session

    web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...

  9. Java基础笔记(1) 语言 JAVA的历史 Java的搭建环境

    本文除了搭建是重点,其他的都当阅读小说一样去看就好了,不想看可以直接抓住重点,我会改变颜色勾出重点! 英语是人与人交流沟通的重要方式之一.JAVA:是人与计算机沟通交流重要方式之一.我们除了用java ...

随机推荐

  1. CSP 202006-1 线性分类器python实现

    思路 这题问题是对于这一群点和一条直线,我们也不知道直线上方的是A类还是直线下方的是A类.其实对于这个二分类问题,我们也没必要知道.我们只需要判断直线每一测的点是不是一类(A类或B类)就可以了. 至于 ...

  2. JS - 有趣的面试题

    for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } //这个例子执行完输出什么结果 ...

  3. const定义的对象属性是否可以改变------是!

    用const声明person对象,给age重新赋值是没问题的 但是重新给person赋值是不可以的 这里需要了解'基本数据类型'和'引用数据类型' 基本数据类型:string, number, boo ...

  4. 简单对比了一下MonoXml与SystemXml在Unity下的表现

    测试代码 public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () ...

  5. unity shader

    Unity新的shader叫做 基于物理渲染的shader,先介绍下新的shader具有的特性: Energy Conservation(能量守恒):这是一个基于物理的概念,它确保物体反射的光线不会比 ...

  6. 跟着兄弟连系统学习Linux-【day03】

    day03-20200529 p10.学习注意事项         linux严格区分大小写(与python有点像)         Linux中所有内容都是通过文件形式保存,通过命令执行设置参数,写 ...

  7. dya49:django:wsgrief&模板渲染Jinjia2&django的MTV/MVC框架&创建/启动一个django项目

    目录 1.自定义web框架wsgiref版 2.自定义web框架wsgiref版-优化版 3.模板渲染JinJa2 4.MTV和MVC框架 5.django:下载安装&创建启动 自定义web框 ...

  8. Java数组实现随机生成N-M之间不重复的随机数

    接收一个整形数组,使用Math.Random每次在规定的数字范围内随机产生数字,然后嵌套for循环依次判断是否有重复值,如果有既外循环变量减一,直到把数组装满为止. /** * 随机生成 N--M的不 ...

  9. window下dos命令

    引用 Windows下DOS命令 显示当前目录所有文件 dir 创建文件夹 md test 创建文件 cd>a.txt 删除文件 del a.txt 删除文件夹 rd test 在某磁盘打开不同 ...

  10. 初次使用maven创建web工程发现只有一个idea目录,src,webapp目录都不见了,解决方案

    修bug系列2之 初次使用maven创建web项目的src目录不知所踪 窗外下着下雨,屋内的我学着maven,本以为轻轻松松,没想到还是遇到了bug.好了不说了,来看看我是怎么解决的. 在初次使用ma ...