一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

電源管理入門:Watchdog看門狗

yzcdx ? 來源:OS與AUTOSAR研究 ? 2023-11-29 10:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

看門狗,又叫 watchdogtimer,是一個(gè)定時(shí)器電路, 一般有一個(gè)輸入,叫喂狗,一個(gè)輸出到MCURST端,MCU正常工作的時(shí)候,每隔一段時(shí)間輸出一個(gè)信號到喂狗端,給 WDT 清零,如果超過規(guī)定的時(shí)間不喂狗,(一般在程序跑飛時(shí)),WDT 定時(shí)超過,就會(huì)給出一個(gè)復(fù)位信號到MCU,是MCU復(fù)位. 防止MCU死機(jī). 看門狗的作用就是防止程序發(fā)生死循環(huán),或者說程序跑飛。

watchdog的操作就是reset,所以跟電源是有聯(lián)系的。

1. 軟硬件watchdog的區(qū)別

通常情況下,watchdog需要硬件支持,但是如果確實(shí)沒有相應(yīng)的硬件,還想使用watchdog功能,則可以使用liunx模擬的watchdog,即軟件watchdog。

硬件watchdog必須有硬件電路支持, 設(shè)備節(jié)點(diǎn)/dev/watchdog對應(yīng)著真實(shí)的物理設(shè)備, 不同類型的硬件watchdog設(shè)備由相應(yīng)的硬件驅(qū)動(dòng)管理。軟件watchdog由一內(nèi)核模塊softdog.ko 通過定時(shí)器機(jī)制實(shí)現(xiàn),/dev/watchdog并不對應(yīng)著真實(shí)的物理設(shè)備,只是為應(yīng)用提供了一個(gè)與操作硬件watchdog相同的接口。

硬件watchdog比軟件watchdog有更好的可靠性。軟件watchdog基于內(nèi)核的定時(shí)器實(shí)現(xiàn),當(dāng)內(nèi)核或中斷出現(xiàn)異常時(shí),軟件watchdog將會(huì)失效。而硬件watchdog由自身的硬件電路控制, 獨(dú)立于內(nèi)核。無論當(dāng)前系統(tǒng)狀態(tài)如何,硬件watchdog在設(shè)定的時(shí)間間隔內(nèi)沒有被執(zhí)行寫操作,仍會(huì)重新啟動(dòng)系統(tǒng)。

一些硬件watchdog卡如WDT501P 以及一些Berkshire卡還可以監(jiān)測系統(tǒng)溫度,提供了 /dev/temperature接口。

對于應(yīng)用程序而言, 操作軟件、硬件watchdog的方式基本相同:打開設(shè)備/dev/watchdog, 在重啟時(shí)間間隔內(nèi)對/dev/watchdog執(zhí)行寫操作。即軟件、硬件watchdog對應(yīng)用程序而言基本是透明的。

在任一時(shí)刻, 只能有一個(gè)watchdog驅(qū)動(dòng)模塊被加載,管理/dev/watchdog 設(shè)備節(jié)點(diǎn)。如果系統(tǒng)沒有硬件watchdog電路,則可以加載軟件watchdog驅(qū)動(dòng)softdog.ko。

2. 軟件看門狗

2.1 kernel watchdog

kernel watchdog是用來檢測Lockup 的。所謂lockup,是指某段內(nèi)核代碼占著CPU不放。Lockup嚴(yán)重的情況下會(huì)導(dǎo)致整個(gè)系統(tǒng)失去響應(yīng)。Lockup有幾個(gè)特點(diǎn):

首先只有內(nèi)核代碼才能引起lockup,因?yàn)橛脩舸a是可以被搶占的,不可能形成lockup(只有一種情況例外,就是SCHED_FIFO優(yōu)先級為99的實(shí)時(shí)進(jìn)程即使在用戶態(tài)也可能使[watchdog/x]內(nèi)核線程搶不到CPU而形成soft lockup)

其次內(nèi)核代碼必須處于禁止內(nèi)核搶占的狀態(tài)(preemption disabled),因?yàn)?a target="_blank">Linux是可搶占式的內(nèi)核,只在某些特定的代碼區(qū)才禁止搶占(例如spinlock),在這些代碼區(qū)才有可能形成lockup。

2.1.1 soft lockup

Lockup分為兩種:soft lockup 和 hard lockup,它們的區(qū)別是 hard lockup 發(fā)生在CPU屏蔽中斷的情況下。而soft lockup則是單個(gè)CPU被一直占用的情況(中斷仍然可以響應(yīng))。

NMI,即非可屏蔽中斷。即使在內(nèi)核代碼中設(shè)置了屏蔽所有中斷的時(shí)候,NMI也是不可以被屏蔽的。

可屏蔽中斷包含時(shí)鐘中斷,外設(shè)中斷(比如鍵盤中斷,I/O設(shè)備中斷,等等),當(dāng)我們處理中斷處理程序的時(shí)候,在中斷處理程序top half時(shí)候,在不允許嵌套的情況下,需要關(guān)閉中斷。

但NMI就不一樣了,即便在關(guān)閉中斷的情況下,他也能被響應(yīng)。觸發(fā)NMI的條件一般都是ECC error之類的硬件Error。但NMI也給我們提供了一種機(jī)制,在系統(tǒng)中斷被誤關(guān)閉的情況下,依然能通過中斷處理程序來執(zhí)行一些緊急操作,比如kernel panic。

檢測soft lockup的原理是給每個(gè)CPU分配一個(gè)定時(shí)執(zhí)行的內(nèi)核線程[watchdog/x],如果該線程在設(shè)定的期限內(nèi)沒有得到執(zhí)行的話就意味著發(fā)生了soft lockup,[watchdog/x]是SCHED_FIFO實(shí)時(shí)進(jìn)程,優(yōu)先級為最高的99,擁有優(yōu)先運(yùn)行的特權(quán)。

系統(tǒng)會(huì)有一個(gè)高精度的計(jì)時(shí)器hrtimer(一般來源于APIC),該計(jì)時(shí)器能定期產(chǎn)生時(shí)鐘中斷,該中斷對應(yīng)的中斷處理例程是kernel/watchdog.c: watchdog_timer_fn(),在該例程中:

要遞增計(jì)數(shù)器hrtimer_interrupts,這個(gè)計(jì)數(shù)器同時(shí)為hard lockup detector用于判斷CPU是否響應(yīng)中斷;

還要喚醒[watchdog/x]內(nèi)核線程,該線程的任務(wù)是更新一個(gè)時(shí)間戳;

soft lock detector檢查時(shí)間戳,如果超過soft lockup threshold一直未更新,說明[watchdog/x]未得到運(yùn)行機(jī)會(huì),意味著CPU被霸占,也就是發(fā)生了soft lockup。

linux kernel會(huì)自動(dòng)檢測softlockup,在發(fā)生softlockup情況下,系統(tǒng)默認(rèn)會(huì)打印相關(guān)warning信息。如果需要出發(fā)panic的話,可以設(shè)置

echo 1 > /proc/sys/kernel/softlockup_panic

可以同時(shí)設(shè)置 watchdog_thresh參數(shù)來定義發(fā)現(xiàn)softlockup以后系統(tǒng)panic的時(shí)間,默認(rèn)是10s, 也就是說20s后系統(tǒng)panic。最大能設(shè)到60s,也就是說,120s后啟動(dòng)系統(tǒng)panic。

一般來說,在production system上,不建議使用softlockup_panic選項(xiàng)(有可能誤傷)??梢栽谡{(diào)試系統(tǒng)上使用。

2.1.1 hard lockup

Hard lockup比soft lockup更加嚴(yán)重,CPU不僅無法執(zhí)行其它進(jìn)程,而且不再響應(yīng)中斷。檢測hard lockup的原理利用了PMU的NMI perf event,因?yàn)镹MI中斷是不可屏蔽的,在CPU不再響應(yīng)中斷的情況下仍然可以得到執(zhí)行,它再去檢查時(shí)鐘中斷的計(jì)數(shù)器hrtimer_interrupts是否在保持遞增,如果停滯就意味著時(shí)鐘中斷未得到響應(yīng),也就是發(fā)生了hard lockup

Linux kernel設(shè)計(jì)了一個(gè)檢測lockup的機(jī)制,稱為NMI Watchdog,是利用NMI中斷實(shí)現(xiàn)的,用NMI是因?yàn)閘ockup有可能發(fā)生在中斷被屏蔽的狀態(tài)下,這時(shí)唯一能把CPU搶下來的方法就是通過NMI,因?yàn)镹MI中斷是不可屏蔽的。

NMI watchdog會(huì)利用到之前講到的hrtimer。它的觸發(fā)條件是基于PMU的NMI perf event,當(dāng)PMU的計(jì)數(shù)器溢出時(shí)會(huì)觸發(fā)NMI中斷,對應(yīng)的中斷處理例程是 kernel/watchdog.c: watchdog_overflow_callback(),hard lockup detector就在其中,它會(huì)檢查上述hrtimer的中斷次數(shù)(hrtimer_interrupts)是否在保持遞增,如果停滯則表明hrtimer中斷未得到響應(yīng),也就是發(fā)生了hard lockup。

這里面,被watch的對象是hrtimer,而watchdog則是由PMU設(shè)備發(fā)起的NMI中斷處理程序 watchdog_overflow_callback()

hardlockup的檢測需要啟動(dòng)NMI watchdog。可以通過設(shè)置內(nèi)核參數(shù)實(shí)現(xiàn):

echo 1 > /proc/sys/kernel/nmi_watchdog 1 在發(fā)生hardlockup情況下,如果我們需要系統(tǒng)panic,可以設(shè)置(默認(rèn)已設(shè)定)

echo 1 > /proc/sys/kernel/hardlockup_panic

2.2 用戶態(tài)watchdog

用戶程序有可能占著臨界資源無法釋放,系統(tǒng)太忙,疲于響應(yīng)各種中斷,導(dǎo)致無法執(zhí)行調(diào)度程序。這都可能導(dǎo)致系統(tǒng)無法正常使用。

在這種情況下,時(shí)鐘中斷和NMI中斷仍然能夠被響應(yīng),所以內(nèi)核lockup檢測機(jī)制無法檢查出來。但由于系統(tǒng)已經(jīng)無法正常工作,我們需要一種機(jī)制,一種用戶態(tài)的watchdog,來檢測這種系統(tǒng)掛起的狀態(tài),并作出相應(yīng)的動(dòng)作。

用戶態(tài)watchdog,自然檢測的對象是用戶態(tài)的程序(是否能被調(diào)度)。這里面,基于硬件支持程度不同,我們分為hardware watchdog和software watchdog。后者簡稱softdog。

2.2.1 softdog

使用softdog很簡單,只需要:

安裝 watchdog rpm

啟動(dòng)softdog服務(wù)
-systemctl start softdog.service

默認(rèn)情況下,watchdog程序會(huì)通過softdog.ko創(chuàng)建一個(gè)叫做/dev/watchdog1的設(shè)備(timer 設(shè)備),并且定期往它寫東西(用于更新時(shí)間戳)。

位于內(nèi)核的softdog會(huì)模擬timer設(shè)備(通過時(shí)鐘中斷的方式模擬),并執(zhí)行相應(yīng)的中斷處理例程,該例程的目的是檢查timer 設(shè)備(即/dev/watchdog1)是否timeout。如果timeout,則執(zhí)行相應(yīng)動(dòng)作(默認(rèn)為panic)。

2.2.1 hardware watchdog

通過BMC實(shí)現(xiàn)、通過iTCO實(shí)現(xiàn)

3. 硬件看門狗

3.1 硬件寄存器介紹

看門狗主要由寄存器、計(jì)數(shù)器和狗叫模塊構(gòu)成,通過寄存器對看門狗進(jìn)行基本設(shè)置,計(jì)數(shù)器計(jì)算狗叫時(shí)間,狗叫模塊決定看門狗超時(shí)后發(fā)出的中斷或復(fù)位方式。

QOTOM Q300P自帶硬件看門狗,由SuperIO芯片提供,這里簡單實(shí)現(xiàn)一下看門狗的復(fù)位功能,只需要對看門狗的配置寄存器組和數(shù)據(jù)寄存器組進(jìn)行操作。

WDTCTRL:Watch Dog Timer Control Register (Index=71h, Default=00h) 控制寄存器,主要是設(shè)置中斷,這里不涉及

WDTCONF:Watch Dog Timer Configuration Register (Index=72h, Default=001s0000b) 配置寄存器 Bit6 or Bit4設(shè)置為1即可開啟看門狗功能,這里使用Bit6脈沖信號

36904ce4-8dda-11ee-939d-92fbcf53809c.pngWDTVALLSB:Watch Dog Timer Time-out Value (LSB) Register (Index=73h, Default=38h) 低位數(shù)據(jù)寄存器WDTVALMSB:Watch Dog Timer Time-out Value (MSB) Register (Index=74h, Default=00h) 高位數(shù)據(jù)寄存器

3.2 喂狗操作

samples/watchdog/watchdog-simple.c中有一個(gè)簡單的例子:

int main(void)
{
int fd = open("/dev/watchdog", O_WRONLY);
int ret = 0;
if (fd == -1) {
perror("watchdog");
exit(EXIT_FAILURE);
}
while (1) {
ret = write(fd, "?", 1);
if (ret != 1) {
ret = -1;
break;
}
sleep(10);
}
close(fd);
return ret;
}

3.3 watchdog硬件驅(qū)動(dòng)編寫

例如:drivers/watchdog/imx_sc_wdt.c中 imx_sc_wdt_probe中會(huì)調(diào)用devm_watchdog_register_device

#define DEFAULT_TIMEOUT 60
#define MAX_TIMEOUT 128

static int imx_sc_wdt_probe(struct platform_device *pdev)
{
struct watchdog_device *wdog;
struct device *dev = &pdev->dev;
int ret;

wdog = &imx_sc_wdd->wdd;
wdog->info = &imx_sc_wdt_info;
wdog->ops = &imx_sc_wdt_ops;
wdog->min_timeout = 1;
wdog->max_timeout = MAX_TIMEOUT;
wdog->parent = dev;
wdog->timeout = DEFAULT_TIMEOUT;

ret = imx_sc_wdt_set_timeout(wdog, wdog->timeout);
if (ret)
return ret;

return devm_watchdog_register_device(dev, wdog);

imx_sc_wdt_ops的定義為:

static const struct watchdog_ops imx_sc_wdt_ops = {
.owner = THIS_MODULE,
.start = imx_sc_wdt_start,
.stop  = imx_sc_wdt_stop,
.ping  = imx_sc_wdt_ping,
.set_timeout = imx_sc_wdt_set_timeout,
.set_pretimeout = imx_sc_wdt_set_pretimeout,
};

例如imx_sc_wdt_start的實(shí)現(xiàn),使用了smc下發(fā)到BL31中處理,為了突出安全性。

static int imx_sc_wdt_start(struct watchdog_device *wdog)
{
struct arm_smccc_res res;

arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_START_WDOG,
      0, 0, 0, 0, 0, 0, &res);
if (res.a0)
return -EACCES;

arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_SET_WDOG_ACT,
      SC_TIMER_WDOG_ACTION_PARTITION,
      0, 0, 0, 0, 0, &res);
return res.a0 ? -EACCES : 0;
}

后記:

對于重要的驅(qū)動(dòng)操作的寄存器,在ARM中需要放入BL31中,也就是說寄存器地址是在安全世界的,不能讓內(nèi)核直接按地址操作,只暴露了通用的協(xié)議接口,就是一個(gè)約束,只能這么用,其他用法不行。暴露API而不是所有寄存器是安全世界和非安全世界的一個(gè)重要區(qū)別?!吧抖级稽c(diǎn),啥都不精通,

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17984

    瀏覽量

    367090
  • 看門狗
    +關(guān)注

    關(guān)注

    10

    文章

    583

    瀏覽量

    71815
  • 電源管理
    +關(guān)注

    關(guān)注

    117

    文章

    6437

    瀏覽量

    146132
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3298

    瀏覽量

    118974

原文標(biāo)題:電源管理入門-14 Watchdog

文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32中的獨(dú)立看門狗和窗口看門狗是什么

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立看門狗
    的頭像 發(fā)表于 02-20 17:47 ?3444次閱讀
    STM32中的獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>是什么

    什么是模擬看門狗?模擬看門狗有什么用處?

    看門狗大家應(yīng)該再熟悉不過了,一旦忘記喂狗就會(huì)導(dǎo)致單片機(jī)復(fù)位,而在大部分stm32中都存在兩種類型的看門狗,Independent watchdog (IWDG)獨(dú)立看門狗和Window
    的頭像 發(fā)表于 11-22 09:40 ?2398次閱讀
    什么是模擬<b class='flag-5'>看門狗</b>?模擬<b class='flag-5'>看門狗</b>有什么用處?

    看門狗watchdog的理解

    轉(zhuǎn)帖1.什么是watchdog?watchdog,中文名稱叫做“看門狗”,全稱watchdog timer,從字面上我們可以知道其實(shí)它屬于一種定時(shí)器。然而它與我們平常所接觸的定時(shí)器在作
    發(fā)表于 12-15 09:38

    看門狗(WatchDog)是什么

    看門狗(WatchDog)是什么?看門狗簡介STM32 有兩個(gè)看門狗,一個(gè)是獨(dú)立看門狗,另外一個(gè)是窗口
    發(fā)表于 07-30 06:19

    看門狗(watchdog)的作用?STM32包含哪幾個(gè)看門狗

    1. 看門狗(watchdog)的作用:實(shí)時(shí)檢測單片機(jī)的程序運(yùn)行狀態(tài),防止程序跑飛造成無法預(yù)料的結(jié)果。2. STM32包含哪幾個(gè)看門狗(獨(dú)立看門狗和窗口
    發(fā)表于 01-10 06:54

    看門狗(WatchDog)

    LPC1138看門狗(WatchDog)。
    發(fā)表于 01-13 16:35 ?44次下載

    stm32看門狗時(shí)間計(jì)算 獨(dú)立看門狗和窗口看門狗的特性是什么

    本文為您講解STM看門狗時(shí)間計(jì)算(時(shí)限)與頻率計(jì)算,獨(dú)立看門狗和窗口看門狗的特性、區(qū)別與聯(lián)系。
    發(fā)表于 10-10 10:41 ?9011次閱讀

    看門狗(WatchDog

    看門狗(WatchDog
    發(fā)表于 10-11 14:55 ?18次下載
    <b class='flag-5'>看門狗</b>(<b class='flag-5'>WatchDog</b>

    什么是stm32看門狗?獨(dú)立看門狗和窗口看門狗工作原理解析

    stm32有兩個(gè)看門狗,獨(dú)立看門狗和窗口看門狗,其實(shí)兩者的功能是類似的,只是喂狗的限制時(shí)間不同。 獨(dú)立看門狗
    的頭像 發(fā)表于 11-06 11:48 ?2.8w次閱讀
    什么是stm32<b class='flag-5'>看門狗</b>?獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>工作原理解析

    STM32看門狗配置(獨(dú)立看門狗IWDG和窗口看門狗WWDG)

    stm32自帶兩個(gè)看門狗模塊,獨(dú)立看門狗IWDG和窗口看門狗WWDG。看門狗主要作用是可用來檢測和解決由軟件錯(cuò)誤引起的故障;當(dāng)計(jì)數(shù)器達(dá)到給定的超時(shí)值時(shí),觸發(fā)一個(gè)中斷(僅適用于窗口型
    發(fā)表于 11-09 17:17 ?8592次閱讀
    STM32<b class='flag-5'>看門狗</b>配置(獨(dú)立<b class='flag-5'>看門狗</b>IWDG和窗口<b class='flag-5'>看門狗</b>WWDG)

    STM32:獨(dú)立看門狗、窗口看門狗的配置

    STM32單片機(jī)的看門狗有獨(dú)立看門狗和窗口看門狗之分,這兩者的工作原理卻完全不同。
    發(fā)表于 02-08 16:15 ?18次下載
    STM32:獨(dú)立<b class='flag-5'>看門狗</b>、窗口<b class='flag-5'>看門狗</b>的配置

    STM32中的獨(dú)立看門狗和窗口看門狗

    一、前言 在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立
    的頭像 發(fā)表于 12-22 16:58 ?2563次閱讀

    STM32中的獨(dú)立看門狗和窗口看門狗

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立看門狗
    的頭像 發(fā)表于 01-30 14:38 ?1768次閱讀
    STM32中的獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>

    什么是看門狗,工業(yè)路由器看門狗技術(shù)的功能優(yōu)勢

    工業(yè)路由器大多都會(huì)配備看門狗技術(shù),它是保證工業(yè)路由器傳輸過程中連續(xù)24小時(shí)不宕機(jī)的重要保護(hù)技術(shù),那么,什么是看門狗呢?▍看門狗功能看門狗,又叫wat
    的頭像 發(fā)表于 03-27 10:16 ?2445次閱讀
    什么是<b class='flag-5'>看門狗</b>,工業(yè)路由器<b class='flag-5'>看門狗</b>技術(shù)的功能優(yōu)勢

    看門狗”也有軟硬

    工業(yè)無線路由器、工業(yè)級無線DTU上“看門狗”技術(shù)為何如此受歡迎?今天我們就來搞懂它。一.什么是“看門狗看門狗,又叫watchdog,從本質(zhì)上來說就是一個(gè)定時(shí)器電路,一般有一個(gè)輸入和一
    的頭像 發(fā)表于 09-08 09:52 ?1462次閱讀
    “<b class='flag-5'>看門狗</b>”也有軟硬