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





