【簡介】嵌入式系統應用很廣泛,無論家庭生活至工業生產都能有其應用範圍,對於家用而言,系統正常工作並非必要,不穩至停板只要一個Reset紐就可以解決,但對於工業應用而言,任何不正常的控制命令都可能導致重大損失。因此以「正常工作」是首要條件,「WatchDog Timer」這無時無刻監視著系統的小狗便是一個直接有效的工具,當系統遲緩或停擺時,可立刻發現並執行必要的工作。

【觀念】從軟體開發者的角度而言,「WatchDog Timer」就是一個倒數裝置,當時間倒數至0就會執行一內定工作,一般是給予Reboot,所以,程式必須在倒數結束內必須給予Strobe,告知狗狗程式還正常運行,狗狗將會恢復倒數時間重新倒數,如此週而復始的監視系統。

【實現】當然WatchDog這樣簡單的程式邏輯用一個高優先的執行緒便可搞定,但對於「監視」這樣重要的工作我是比較喜歡硬體中斷,在硬體上能選擇有此功能最好。在此以硬體WatchDog Timer為範例。

控制命令相當簡單,只需用CreateFile與DeviceIOControl配合IOCTL code即可,開啟方式:

m_hWDT = CreateFile(_T"WDT1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

其中"WDT1:" 是根據作業系統的驅動程式定義,並非一定。

常用的IOCTL有:

  • IOCTL_WDT_ENABLE:啟動WatchDog
    IOCTL_WDT_DISABLE:關閉WatchDog
  • IOCTL_WDT_GET_ENABLE_STATUS:取得WatchDog啟動狀態
  • IOCTL_WDT_STROBE:重置倒數器
  • IOCTL_WDT_REBOOT:倒數器至零便重新開機
  • IOCTL_WDT_GET_REBOOT_STATUS:取得重新啟動狀態
  • IOCTL_WDT_SET_TIMEOUT:設定計數器時間設定
  • IOCTL_WDT_GET_TIMEOUT:取得計數器時間設定
  • IOCTL_WDT_GET_CHIPSET_TYPE:取得硬體CHIPSET_TYPE

大部分指令都很簡單,需要注意的是計數器的Timeout並非可隨意給定,是由Chipset決定,每個Chipset給予的計數時間皆不同,因此保險的系統開發是先用IOCTL_WDT_GET_CHIPSET_TYPE取得CHIPSET型態,再根據不同的CHIPSET執行SET_TIMEOUT,而給予Timeout的數值並非秒數而是各CHIPSET定義的Index。

各CPU提供的Timout Index依序如下:

WDT_CHIPSET_TYPE_443 2 Seconds、5 Seconds
10 Seconds、15 Seconds
30 Seconds 、45 Seconds
60 Seconds
WDT_CHIPSET_TYPE_W83977AF 15 Seconds   
75 Seconds
1 Minute 15 Seconds
2 Minutes 15 Seconds
3 Minutes 15 Seconds
4 Minutes 15 Seconds
5 Minutes 15 Seconds
10 Minutes 15 Seconds
20 Minutes 15 Seconds
30 Minutes 15 Seconds
40 Minutes 15 Seconds
50 Minutes 15 Seconds
1 Hour 15 Seconds
2 Hours 15 Seconds
WDT_CHIPSET_TYPE_W83627HF 15 Seconds   
45 Seconds
1 Minute 15 Seconds
2 Minutes 15 Seconds
3 Minutes 15 Seconds
4 Minutes 15 Seconds
WDT_CHIPSET_TYPE_S3C24X0 2 Seconds、5 Seconds
10 Seconds、15 Seconds
30 Seconds、40 Seconds


控制命令範例:

DeviceIoControl(m_hWDT, IOCTL_WDT_GET_CHIPSET_TYPE,  NULL, 0, &mChipsetType, 1, &Temp, NULL);

DeviceIoControl(m_hWDT, IOCTL_WDT_SET_TIMEOUT, &mTimeoutIndex,  0, NULL, 0, NULL, NULL);

DeviceIoControl(m_hWDT,IOCTL_WDT_GET_ENABLE_STATUS,NULL, 0,&mEnableStatus,1,&Temp,NULL);

arrow
arrow
    全站熱搜

    傑克鼠 發表在 痞客邦 留言(2) 人氣()