AURIX TC397 SCU 之 Watchdog 看門狗

weifengdq發表於2020-11-10

看門狗基礎

文件參閱 TC3XX User Manual 的9.4節, 看門狗Watchdog Timers (WDT)是System Control Units (SCU)六大模組之一.

TC3xx包含以下看門狗定時器:

  • 1個安全看門狗定時器(Safety Watchdog Timer), 防止意外寫入關鍵系統暫存器和儲存器, 一定時間內未響應其計時器, 將引發SMU警報請求.
  • 每個CPU一個看門狗定時器(CPU Watchdogs Timer ), 為CPU暫存器以及特定的系統暫存器提供保護, 監視單獨的CPU, 一定時間內未重新整理, 將觸發裝置復位.

每個看門狗定時器具有以下基本功能:

  • 可程式設計的時基和過載值
  • 可程式設計的密碼保護以及可配置的自動密碼序列(automatic password sequencing)
  • 帶有可程式設計視窗的可程式設計時間戳檢查
  • 無效或缺少計時器重新整理序列會導致安全警報(Safety Alarm)
  • 可在除錯期間掛起看門狗操作
  • 關鍵暫存器防寫,只能在短超時時間內解鎖

AURIX TC2xx SCU WDT和AURIX TM TC3xx SCU WDT之間最重要的變化是:

  • 暫存器地址更改
  • 增加的CPU響應增加相應的看門狗定時器
  • 可以通過新的ENDINIT(End-of-Initialization, 初始化終止)超時計數器(EICON暫存器)進行ENDINIT解鎖,而不會影響任何CPU看門狗定時器
  • 可以通過新的安全ENDINIT超時計數器(SEICON暫存器)解鎖安全ENDINIT,而不會影響安全看門狗定時器
  • 安全看門狗定時器的單獨ACCEN保護範圍
  • 外部WDT“活動心跳”指示功能已刪除

WDT提供了一種高度可靠和安全的方法來檢測軟體或硬體故障並從中恢復。 WDT有助於在使用者指定的時間段內中止CPU或系統的意外故障.

WDT框圖:

在這裡插入圖片描述

除此標準的“看門狗”功能外,每個WDT都具有初始化終止(ENDINIT, End-of-Initialization)功能,可以保護關鍵暫存器免於意外寫入.

維護看門狗和修改ENDINIT位是至關重要的功能,如果系統出現故障,則不允許這樣做。 為了保護這些功能,實施了一種複雜的方案,該方案在訪問WDT控制暫存器期間需要密碼和保護位。 任何未提供正確密碼或保護位正確值的寫訪問均被視為系統故障,並導致看門狗警報。 另外,即使在執行了有效的訪問並且將ENDINIT位清零以提供對關鍵暫存器的訪問之後,看門狗也對該訪問視窗施加了時間限制。 如果在該限制到期之前未再次正確設定ENDINIT位,則認為系統發生了故障。 這些嚴格的要求儘管不能得到保證,但是仍然為系統操作的魯棒性提供了高度的保證.

可用的配置選項使看門狗服務能夠額外檢查程式碼執行順序和中間程式碼執行時間。 如果啟用了這些檢查,則任何不正確的順序或超限的執行時間也將導致SMU警報請求.

任何WDT到期都會引發SMU警報。 可以對SMU進行程式設計以提供中斷或陷阱,以便在採取進一步措施(例如重置裝置或CPU)之前為恢復或狀態記錄提供一些時間.

Safety Watchdog Timer, 安全看門狗定時器:

  • 提供了獨立於CPU看門狗定時器的整體系統級看門狗,並且還提供了另一種保護措施,以防止意外寫入安全關鍵系統暫存器。 啟用安全WDT時,如果在使用者可程式設計的時間段內未對SMU發出警報,則可能引發SMU警報請求. CPU必須在此時間間隔內為安全WDT服務,以防止發生這種情況。 在SMU中可以配置對安全WDT超時的響應。 因此,定期對Safety WDT進行維護可確認系統正在按預期執行.
  • 通常,將配置SCU防寫(ACCEN),以便只有受限制的“安全” CPU(s)才能配置安全關鍵功能, 這包括服務安全看門狗的能力. 此外,安全監視程式計時器的禁用/啟用/配置功能需要安全ENDINIT密碼

CPU Watchdogs Timer, CPU看門狗定時器:

  • 單獨的CPU看門狗定時器提供了監視單獨的CPU執行執行緒的能力,而無需軟體來協調通用看門狗的共享使用.
  • 啟用CPU WDT時,如果在使用者可程式設計的時間段內未正確服務,則可能導致SMU警報請求。 CPU必須在此時間間隔內為其CPU WDT服務,以防止出現這種情況。 在SMU內可配置對每個CPUy看門狗超時的響應. 因此,對CPU WDT的定期服務確認相應的CPU正在按預期執行軟體序列.
  • 復位後,CPU0執行,並且CPU0看門狗定時器自動啟動. 其他CPU最初處於HALT狀態,因此禁用了它們對應的看門狗定時器。 預設情況下,其他CPU看門狗定時器未配置為生成超時復位,但是可以啟用它. CPU看門狗只能由其相應的CPU進行配置,啟用或禁用.

WDT的主要功能總結如下:

  • 16位看門狗定時器
  • 可選輸入頻率:fSPB / 64,fSPB / 256或fSPB / 16384
  • 正常看門狗定時器操作的16位使用者可定義過載值,超時模式為固定過載值
  • 合併相應的ENDINIT位並監視其修改
  • 具有使用者可定義的密碼欄位的複雜密碼訪問機制
  • 訪問錯誤檢測:無效的密碼(第一次訪問期間)或無效的保護位(第二次訪問期間)觸發對SMU的警報請求
  • 時間和邏輯監視功能:可選的程式碼序列檢查. 錯誤的程式碼序列簽名標識將觸發對SMU的警報請求; 可選的程式碼執行時間檢查, 程式碼執行時間超出預期的限制將觸發向SMU發出警報的請求
  • 溢位錯誤檢測:WDT計數器的溢位觸發向SMU發出警報請求
  • 看門狗功能可以禁用; 訪問保護和ENDINIT位監視功能保持啟用狀態
  • 可配置的機制,以防止在未使用安全警告警報後重新載入看門狗,以確保未使用警告會導致SMU硬體響應

TC397 Watchdog

參考 Watchdog_1 for KIT_AURIX_TC397_TFT

以CPU0的看門狗定時器為例, 步驟如下:

  • 遮蔽預設的關閉CPU看門狗這一句: IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
  • 配置CPU0WDT, IfxScuWdt_changeCpuWatchdogReload, 過載值(REL, Reload Value)預設0xFFFC, 向上計數, 到0xFFFF就溢位了, 這個時間太短, 改為0xE000, 超時時間timeout ≈ (0xFFFF - REL) / (100MHz/16384) ≈ 1.342s, timeout別太小, 可能引起下載時候的麻煩. 值16384是一個常量,由暫存器WDTSCON1的IRx定義
  • 獲取密碼喂狗: IfxScuWdt_serviceCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());

Cpu0_Main.c程式碼如下:

#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"

#include "Bsp.h"

IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;

#define LED         &MODULE_P13, 0

#define REL_VAL     0xE000       /* Reload value for extended timeout window */

void core0_main(void)
{
    IfxCpu_enableInterrupts();
    
    /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdogs and service them periodically if it is required
     */
    //IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
    
    IfxScuWdt_changeCpuWatchdogReload(IfxScuWdt_getCpuWatchdogPassword(), REL_VAL); /* Set CPU0WD timer to ~1.3 sec */
    IfxScuWdt_serviceCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());               /* Service the CPU0WDT          */

    /* Wait for CPU sync event */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
    
    IfxPort_setPinMode(LED,  IfxPort_Mode_outputPushPullGeneral);
    IfxPort_setPinHigh(LED);

    initTime();

    while(1)
    {
        IfxScuWdt_serviceCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());           /* Continuously service CPU0WDT */
        wait(TimeConst_1s);                                                         /* Wait for one second          */
        IfxPort_togglePin(LED);
    }
}

編譯執行, 由於1s<1.34s, 不會復位, LED正常翻轉.

等待時間改為2s: wait(TimeConst_1s*2); 編譯執行, CPU一直復位, LED不會正常翻轉.

微信公眾號

歡迎掃描關注我的微信公眾號, 及時獲取最新文章:
在這裡插入圖片描述

相關文章