Zynq 系列 ps端看門狗詳解
掃描二維碼
隨時隨地手機看文章
看門狗定時器復(fù)位
看門狗定時器復(fù)位在啟用時由看門狗定時器內(nèi)部產(chǎn)生并且計時器到期。
PS 中有三種不同的看門狗定時器:
一個系統(tǒng)級定時器(SWDT)和兩個ARM內(nèi)核(AWDT0和AWDT1)中的每個內(nèi)核中的一個專用計時器。
系統(tǒng)級計時器重置信號始終重置整個系統(tǒng),而專用看門狗計時器可以重置只是它所在的ARM內(nèi)核,或者整個系統(tǒng)。
安全違規(guī)鎖定
當(dāng)檢測到安全沖突時,將重置并鎖定整個PS。
安全鎖后發(fā)生向下,PS僅通過斷言和取消斷言PS_POR_B復(fù)位而再次變?yōu)榛顒訝顟B(tài)。
Zynq-7000 SoC設(shè)備提供以下安全啟動功能:
-
先進的加密標(biāo)準(zhǔn)
-
帶有256位密鑰的AES-CBC(FIPS197)
-
加密密鑰存儲在芯片上,存儲在eFuse或電池供電的RAM(BBRAM)中
-
帶密鑰的消息驗證碼(HMAC,F(xiàn)IPS198-1)
-
SHA-256驗證引擎(FIPS180-4)
-
RSA公鑰認(rèn)證(FIPS186-3)
-
2048位公鑰
私有看門狗與系統(tǒng)看門狗
每個Cortex-A9處理器都有自己私有的32位定時器和32位看門狗定時器,這兩個處理器共享一個全局64位計數(shù)器,它們的頻率都為CPU頻率的1/2。
而在系統(tǒng)級,有一個24位看門狗計時器和兩個16位三重計時器/計數(shù)器,系統(tǒng)級看門狗定時器的頻率為CPU頻率的1/4或1/6,下圖為系統(tǒng)內(nèi)部兩個看門狗所處位置以及關(guān)系圖。
配置WDT程序
由于私有看門狗屬于PS端,所以在vivado環(huán)境中不需要對block塊進行設(shè)置。在vivado下配置如下:
看門狗配置
int watchdogConfig(XScuWdt * WdtInstancePtr, u16 DeviceId,float number) { int Status; XScuWdt_Config *ConfigPtr; u32 result; //用來配置WDT的設(shè)備ID號,ID號在#include "xparameters.h"中可以找到。 xil_printf("start the watchdog time``r successful! \r\n"); ConfigPtr = XScuWdt_LookupConfig(DeviceId); //初始化WDT計數(shù)器 Status = XScuWdt_CfgInitialize(WdtInstancePtr, ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) { return XST_FAILURE; } //通過設(shè)置看門狗控制寄存器的WD模式位,將看門狗定時器置于看門狗模式 XScuWdt_SetWdMode(WdtInstancePtr); //給WDT計數(shù)器裝初值,這里我對此函數(shù)進行了封裝。已知CPU的時鐘頻率為666.6666Mhz, //即WDT的時鐘頻率為333.33Mhz,可得倒計時1s計數(shù)器需要配置的初值為333_333_333, //對計數(shù)器賦的初值可以直接寫在number變量中(本文賦值為10s)。 result = (unsigned long)(333333333*number); XScuWdt_LoadWdt(WdtInstancePtr,result); //開啟看門狗計數(shù)器。 XScuWdt_Start(WdtInstancePtr); return XST_SUCCESS; }
開始測試
給計數(shù)器賦初值為10s,在循環(huán)中啟動喂狗程序,程序會在5S后跳出循環(huán),之后在10s后由于沒有喂狗功能,系統(tǒng)復(fù)位,代碼如下:
#include "xparameters.h" #include "xscuwdt.h" #include "xil_printf.h" #include#include "stdio.h" #define WDT_DEVICE_ID XPAR_SCUWDT_0_DEVICE_ID XScuWdt Watchdog; /* Cortex SCU Private WatchDog Timer Instance */ int main(void) { int Status; int Count = 0; Status = watchdogConfig(&Watchdog, WDT_DEVICE_ID,10); if (Status != XST_SUCCESS) { xil_printf("start the watchdog timer fail!\r\n"); return XST_FAILURE; } while (Count < 5) { sleep(1); Count++; XScuWdt_RestartWdt(Watchdog); printf("the second is %d \n",Count); } xil_printf("the watchdog timer will restart the system \r\n"); return XST_SUCCESS; }
同樣給計數(shù)器賦初始值為10s,禁用喂狗程序,程序會直接在10s后進行系統(tǒng)復(fù)位。
#include "xparameters.h" #include "xscuwdt.h" #include "xil_printf.h" #include#include "stdio.h" #define WDT_DEVICE_ID XPAR_SCUWDT_0_DEVICE_ID XScuWdt Watchdog; /* Cortex SCU Private WatchDog Timer Instance */ int main(void) { int Status; int Count = 0; Status = watchdogConfig(&Watchdog, WDT_DEVICE_ID,10); if (Status != XST_SUCCESS) { xil_printf("start the watchdog timer fail!\r\n"); return XST_FAILURE; } while (Count < 5) { sleep(1); Count++; printf("the second is %d \n",Count); } xil_printf("the watchdog timer will restart the system \r\n"); return XST_SUCCESS; }
總結(jié)
在嵌入式系統(tǒng)中,為了使系統(tǒng)在工作異常情況下能自動重啟,一般都需要引入看門狗程序,用來監(jiān)測程序以免“跑飛”。
看門狗其實就是一個可以在一定時間內(nèi)被復(fù)位的計數(shù)器,當(dāng)看門狗啟動后,計數(shù)器開始自動計數(shù);
經(jīng)過一定時間,如果沒有被復(fù)位,計數(shù)器清零就會對CPU產(chǎn)生一個復(fù)位信號使系統(tǒng)重啟(俗稱“被狗咬”),這個是我們經(jīng)常需要用到的。





