官术网_书友最值得收藏!

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,這種叫進位錯誤。此時有一個辦法,就是先鎖定進入臨界態保護,時鐘就不會累進。結構體類的讀取,往往會有這類問題。

主站蜘蛛池模板: 奉化市| 宜兴市| 桦甸市| 江津市| 新源县| 澄迈县| 耒阳市| 石泉县| 平邑县| 平泉县| 西畴县| 本溪| 伊宁市| 唐山市| 邢台市| 平泉县| 遵化市| 定陶县| 富裕县| 潢川县| 龙山县| 长葛市| 南川市| 林口县| 昭苏县| 渝中区| 灌云县| 翁牛特旗| 孟村| 英德市| 延寿县| 外汇| 竹北市| 华宁县| 泰宁县| 柞水县| 伽师县| 日照市| 东丽区| 惠东县| 罗田县|