上QQ阅读APP看书,第一时间看更新
1.3.7 计时时钟
计时时钟是基于系统节拍模拟的一个计时用时钟,用于记录系统工作的时间,如天、时、分、秒。这个功能是模拟的,跟专用带独立电池的32.768 kHz晶体的RTC时钟有些差异:
1)系统重启后,时间归零,适合于常规的只需要知道当前工作了多久的系统;
2)因为从系统时钟分频而来,精度没有专用的时钟高。
计时时钟的数据结构如下。
代码清单1-22:RTC时钟结构体
typedef struct { Byte Second; // 秒 Byte Minute; // 分 Byte Hour; // 时 ushort Day; // 天 } RtcStruct; RtcStruct idata Rtc; // 定义Rtc实体
计时时钟的系统节拍例行处理函数如下。
代码清单1-23:RTC系统节拍例行代码
void RtcSystickRoutine(void) { static Byte idata Counter = 0; if (++Counter == 100) { Counter = 0; if (Rtc.Second < 59) // 累进到分 Rtc.Second++; else { Rtc.Second = 0; if(Rtc.Minute < 59) // 累进到时 Rtc.Minute++; else { Rtc.Minute = 0; if(Rtc.Hour < 23) // 累进到天 Rtc.Hour++; else { Rtc.Hour = 0; Rtc.Day++; } } } } }
需要注意的是,时钟累进在节拍中断中进行,而RTC是一个结构体,成员累进不是原子操作,读取数据的时候,需要进入临界态保护,防止出现进位采样错误。比如当前时分秒为0:59:59,若从Second开始读取,假如在读Minute的时候数据进位了,则变成了1:0:59,或者是1:59:59,这种叫进位错误。此时有一个办法,就是先锁定进入临界态保护,时钟就不会累进。结构体类的读取,往往会有这类问题。