在上一篇博客中,我們查看了 Zynq All Programmable SoC 中每個 CPU 提供的私有計時器。在本博客中,我們將了解 Zynq SoC 的私有看門狗定時器,以及如何使用它,我們將查看其使用示例。
參考:
?UG585 CH8 Timer
每個A9處理器都有私有的32位定時器和32位看門狗定時器。兩個處理器共享一個64位定時器。這些定時器的時鐘始終是的CPU頻率的1/2(CPU_3x2x)。
然而,在我們研究如何配置和使用 Zynq 看門狗之前,我認為最好先了解一下為什么需要看門狗定時器以及看門狗是如何工作的。看門狗解決了無響應軟件的必然性,并為這個問題提供了可靠的解決方案。無論最終應用是什么,所有工程師都希望提供可靠的解決方案,優(yōu)秀的系統(tǒng)設(shè)計人員知道他們必須針對所有可能性進行設(shè)計。
系統(tǒng)工程團隊必須采取許多步驟來確??煽康脑O(shè)計。第一步是建立定義系統(tǒng)及其軟件行為的需求基線。然后,工程團隊按照軟件生命周期實施這些要求,其中包括:
- 設(shè)計文檔的生成
- 軟件設(shè)計和源代碼
- 驗證策略是否已達到要求
大多數(shù)設(shè)計將包括確保軟件能夠?qū)ο到y(tǒng)故障做出合理響應的方法。這些故障可能會產(chǎn)生兩種影響之一——允許軟件繼續(xù)運行,同時保持完整或減少的服務,或者完全無法響應。當軟件無法響應時,看門狗定時器可以重新啟動系統(tǒng)或確保系統(tǒng)安全的發(fā)生故障。(安全關(guān)鍵系統(tǒng)和軟件的問題是一個復雜的問題,需要的空間比我在這里詳細介紹的要多。)
從最簡單的意義上說,看門狗是一個從預加載值開始倒計時的計時器。當軟件應用程序執(zhí)行時,它會定期重置看門狗。如果軟件未能重置看門狗,它的計數(shù)將達到零,然后看門狗電路復位處理器。當軟件正常運行時,看門狗計數(shù)永遠不會達到零。如果軟件由于某種原因出現(xiàn)故障,則看門狗不會復位,計數(shù)達到零,處理器復位,軟件重新啟動。許多系統(tǒng)都有一個寄存器,它在看門狗觸發(fā)時設(shè)置了一個位。此功能允許系統(tǒng)從看門狗復位中恢復過來,同時注意看門狗觸發(fā)了復位這一事實。
Zynq SoC 中的兩個 ARM Cortex-A9 處理器中的每一個都有一個私有看門狗定時器。這些私有看門狗可以用作像私有計時器(在本系列的上一篇博客文章中討論過)這樣的計時器,也可以用作看門狗。Zynq 看門狗定時器通過六個寄存器控制:
- 看門狗加載寄存器(Watchdog Load Register):保存看門狗定時器倒計時的值。在自動重載模式下,看門狗計數(shù)器重置為存儲在該寄存器中的值。寫入該寄存器將導致看門狗計數(shù)器寄存器重置為此值。
- 看門狗計數(shù)器寄存器(Watchdog Counter Register):這是看門狗計數(shù)器本身。是遞減計數(shù)器。根據(jù)看門狗模式,寫入該寄存器會重新加載計數(shù)器。在看門狗模式下,該寄存器只能通過寫入看門狗加載寄存器來更新。
- 看門狗控制寄存器(Watchdog Control Register):該寄存器控制看門狗(定時器或看門狗)的配置、預分頻器設(shè)置、中斷啟用、自動重載模式以及看門狗在其當前配置模式下的啟用。
- 看門狗中斷狀態(tài)寄存器(Watchdog Interrupt Status Register):包含一個事件標志,顯示計數(shù)器何時達到零。寫入該寄存器會重置它。
- 看門狗復位狀態(tài)寄存器(Watchdog Reset Status Register):該寄存器僅包含一位,僅由上電復位(不是看門狗觸發(fā)的復位)清除。它也可以通過軟件應用程序清除。復位狀態(tài)位允許軟件確定重啟的原因是否是由看門狗超時引起的。
- 看門狗禁用寄存器(Watchdog Disable Register):當看門狗設(shè)置為定時器模式時,該寄存器需要寫入兩個特定模式以啟用看門狗控制寄存器中的看門狗模式位。
正如我們在 Zynq SoC 的私有定時器中看到的那樣,Zynq 軟件開發(fā)環(huán)境提供了許多可用于配置和驅(qū)動看門狗的函數(shù)和宏。這些包含在#include "xscuwdt.h" 中。該文件使工具能夠:
- 測試看門狗是否過期
- 加載看門狗
- 啟動、停止和重新啟動看門狗
- 設(shè)置看門狗模式
- 配置和初始化看門狗
以下示例將看門狗配置為不刷新的傳統(tǒng)看門狗,以便看門狗在超時時復位 Zynq SoC。然后,示例代碼檢查以確定在看門狗復位(例如上電復位或看門狗超時)后復位的原因,并通過 STDOUT 報告此情況。按下按鈕啟動私人(專用)定時器,點亮 LED,并啟動看門狗。為了做到這一切,我們按照標準方法配置看門狗,就像我們迄今為止使用來自 xparameters.h 的數(shù)據(jù)和配置例程對所有外設(shè)所做的那樣:
//defineprivatewatchdog
#defineWDT_DEVICE_IDXPAR_SCUWDT_0_DEVICE_ID
#defineINTC_DEVICE_IDXPAR_SCUGIC_SINGLE_DEVICE_ID
#defineWDT_IRPT_INTRXPAR_SCUWDT_INTR
#defineWDT_LOAD_VALUE0xFF
//看門狗配置
WCHConfigPtr=XScuWdt_LookupConfig(WDT_DEVICE_ID);
XScuWdt_CfgInitialize(&WdtInstance,WCHConfigPtr,WCHConfigPtr->BaseAddr);
XScuWdt_LoadWdt(&WdtInstance,WDT_LOAD_VALUE);
XScuWdt_Start(&WdtInstance);
在初始化和加載看門狗之后,接下來的步驟是啟用中斷(在中斷配置函數(shù)內(nèi))并將看門狗設(shè)置為看門狗功能,而不是使用 XScuWdt_SetWdMode() 函數(shù)的定時器功能:
//setupthewatchdog
XScuGic_Connect(GicInstancePtr,WdtIntrId,(Xil_ExceptionHandler)WdtIntrHandler,
(void*)WdtInstancePtr);
//設(shè)置看門狗
XScuWdt_SetWdMode(WdtInstancePtr);
如果我們希望在定時器模式下使用看門狗,我們可以調(diào)用函數(shù):XScuWdt_SetTimerMode()這就是為什么我設(shè)置中斷以觸發(fā)在定時器模式下運行的看門狗并為看門狗聲明一個空的中斷服務程序,在這種情況下將被調(diào)用。
我們可以使用讀取看門狗復位狀態(tài)寄存器的函數(shù)來查看最后一次復位是否是由于看門狗事件:
XScuWdt_IsWdtExpired(InstancePtr)
下圖顯示了當處理器從上電復位和按下按鈕以啟用看門狗定時器時發(fā)生的復位上電時通過 STDOUT 輸出的結(jié)果:
先前的復位狀態(tài)保持存儲在其中的看門狗事件的狀態(tài)通過 XScuWdt_IsWdtExpired() 訪問的看門狗復位狀態(tài)寄存器。
此示例的源代碼:
?https://gitee.com/openfpga/zynq-chronicles/blob/master/main_part16.c
審核編輯 :李倩
-
看門狗
+關(guān)注
關(guān)注
10文章
558瀏覽量
70713 -
寄存器
+關(guān)注
關(guān)注
31文章
5295瀏覽量
119838 -
定時器
+關(guān)注
關(guān)注
23文章
3232瀏覽量
114334
原文標題:ZYNQ從放棄到入門(六)- 專用看門狗
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論