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语言之 面向对象+虚事务的抽象:针对多次同步失败的节能处理机制
(这种写法像寸拳,一上来搞一堆变量,这点没几行的东西是我七八个月前些的代码,我花了一整天时间才重新看明白看透,又整理重命名了一些变量名,使其带有更直观的物理意义,上传到博客。
寸拳,刚劲有力,出击快速,但是没有章法可寻。
下一集,我讲化寸拳为太极拳,按照常规思维,使编程有章法可寻,才能以不变去应对变化。
只有那样,我在面对新的未知业务的时候,我心里能有常规的应对策略可使。)
最新文章
- C和指针 第三章 指针常量与常量指针
- PYTHON学习之路_PYTHON基础(1)
- cgroup隔离的知识点
- oracle11g+ef+vs2013做的项目在部署的时候碰到的问题
- HTML CSS基础(三)
- 软件工程(GZSD2015)第三次作业
- mybatis插入实体到数据库后获取自增的主键
- Macbook pro从购买服务器到搭建服务器环境(1)
- Codeforces Round 1152 (div. 2)
- Helm使用详解
- 20171026python读取txt写入csv
- this、new,容易混淆的地方
- java分解质因数,具体程序分析和代码
- Linux信号(signal)机制【转】
- js冲刺一下
- PHP垃圾回收机制防止内存溢出
- Beta 冲刺1
- JSP 上传文件
- C语言中文件目录(一正二反)斜杠
- 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)