- 嵌入式微系統
- 王紹偉 鄭德智 吳玉勇
- 458字
- 2019-01-03 20:54:14
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,這種叫進位錯誤。此時有一個辦法,就是先鎖定進入臨界態保護,時鐘就不會累進。結構體類的讀取,往往會有這類問題。
推薦閱讀
- SharePoint 2013 WCM Advanced Cookbook
- Linux Shell編程從入門到精通(第2版)
- Windows Phone應用程序開發
- 奔跑吧 Linux內核(入門篇)
- 網絡操作系統管理與應用(第三版)
- Windows 7中文版從入門到精通(修訂版)
- Ubuntu Linux操作系統實用教程
- Linux應用大全 基礎與管理
- Linux 從入門到項目實踐(超值版)
- Angular權威教程
- Android NDK Beginner's Guide
- Docker容器技術與運維
- Hadoop Operations and Cluster Management Cookbook
- 鴻蒙HarmonyOS應用開發從入門到精通
- Linux從入門到精通