日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ

看門狗定時器復(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)常需要用到的。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉