嵌入式系統中看門狗概述。。。

????? 一直以來對于嵌入式中的watch dog(看門狗)都比較陌生,一直都不知道它到底是做什么的,單從名字上看也不知其所以然,然后就在網上找到了一篇blog,就是再說看門狗的作用和概述,原文如下:

?

?1、概述:

????? WATCHDOG對于沒有底層開發經驗的開發人員來說,可能比較陌生,但是它在系統起到非常重要的作用,相當于系統警察,當系統發生嚴重錯誤(如程序進入死循環等)不能 恢復的時候,WATCHDOG能夠讓系統重啟WATCHDOG的應用主要是在嵌入式操作系統中,避免了系統在無人干預時長時間掛起的情況

?2、WATCHDOG模塊

????? 在比較高檔的嵌入式硬件芯片中,都有一個WATCHDOG模塊,如果在MCU/MPU中沒有集成WATCHDOG,一般會在此嵌入式系統中加一個專門的WATCHDOG芯片來實現WATCHDOG機制。此模塊主要的功能包括:

????? 1、提供WATCHDOG控制寄存器和配置寄存器,供軟件開發人員根據系統需要進行靈活配置。

????? 2、提供一接口,使應用軟件能夠定時給WATCHDOG“喂狗”。

????? 3、提供WATCHDOG機制,當系統進入不可恢復錯誤時,能產生一個不可屏蔽中斷來通知系統自動重啟(一般這樣,也有改變為其他處理方式的),只有相應的復位信號才能清除它。

?3、WATCHDOG的實現方式:

????? 對于WATCHDOG模塊的實現,不同的硬件芯片有不同的方式,這里介紹2中工作方式:

????? 1、利用系統操作系統時鐘來實現WATCHDOG

????? 在Intel XScale系列中,利用了操作系統時鐘的比較寄存器3(OSMR3)做為WATCHDOG的運行主體,當系統的WATCHDOG激活后,軟件就必須在一定時間內從OSMR3讀出當前的計數,然后加上一定的計數值(下一次到期的計數值),再寫回到OSMR3中,軟件一直周期性的重復這個過程,如果軟件沒有重新寫入新的計數使定時器到期,此OSMR3會利用一個GPIO觸發系統復位。

????? 2、芯片的專門WATCHDOG模塊

????? 對于現在的很多芯片,已經集成了專門的WATCHDOG模塊,比如ARM11的芯片,WATCHDOG模塊中,提供了比較靈活的配置和控制機制:

????? A、寬范圍設置過期時間間隔,從0。5秒到128秒可以用戶配置

????? B、可以靈活配置在低功耗下,使用或者停止WATCHDOG功能

????? C、可以靈活配置在DEBUG等狀態下,使用或者停止WATCHDOG功能

????? 根據不同的系統,設置好相應的寄存器,激活WATCHDOG后,需要應用程序周期性的服務WATCHDOG,即我們所說的“喂狗”,對于 WATCHDOG模塊,需要定時向Watchdog Service Register按順序寫入0x5555,0xaaaa.一般 在WATCHDOG模塊中還會提供Watchdog Reset Status Register,從中可以找到復位的具體原因。

????? 3、單片機的WATCHDOG實現

????? 許多單片機片內自帶看門狗電路,單片機復位時將片內自帶看門狗電路禁止,只有當程序訪問該電路時,電路啟動。如51系列單片機對SFR中的0A6H 地址順序寫入#01EH、#0E1H;而96系列單片機則對SFR中的0A6H地址順序寫入#1EH、#0E1H;工控主機板上看門狗電路本身并不要求復位后重新啟動,但BIOS在復位后將板上看門狗禁止,啟動和喂狗方法與單片機相同。如研祥的FSC-1713主板,在WatchDog編程狀態,只要執行如下兩條指令:

????? outportb(0x2e,0xf6);??

????? outportb(0x2f,TIME-OUT-VALUE);

可實現WatchDog的啟停,其中TIME-OUT-VALUE ≠0啟動;TIME-OUT-VALUE =0停止[2] 。能夠用指令禁止看門狗是為了適應用戶程序開發階段的需要,這同時給看門狗啟動和運行失敗留下了后門,在看門狗啟動時或啟動前遇干擾而使程序跑飛,則看門狗啟動失敗,無法行使監控職能。

????? 4、結論

????? WATCHDOG在嵌入式系統中發揮著非常重要的作用,其實現方式也千差萬別,根據不同的硬件設計,可以選用不同的WATCHDOG,但它們的作用是一樣的:保證系統在出現不可恢復錯誤時,能夠自動讓系統重啟。

參考資料:

1.Intel XScale Pocessor Developer's Manual????

2.Arm11 芯片用戶手冊

3.WatchDog失效機理與對策研究

?

????? 以上就是原文,對我理解看門狗有一定的幫助,也希望能夠幫助大家。

?

?

linux嵌入式系統開發之看門狗---應用篇
“小濤哥,你的這個什么板子是不是壞了啊,為啥老是重啟,好奇怪啊….”小王好奇的指著我心愛的板子說。

“笨死啦,沒看到嗎, 我昨天化了一上午寫的一個看門狗程序…”我生氣而又無奈的說。

“等等,啥?看門狗?我聽過哈巴狗,牡羊狗,落水狗,流浪狗,還就是沒聽說過你的說的那個啥子 看門狗 ”小王嘴一噘鎖,“哼,你是看我不懂,忽悠我的吧”..

“切,不懂就是不懂,這還就是你沒聽過的 看門狗 ”我故意提高了音調說。

? 算啦,也不賣官腔了,開始今天的課程----linux嵌入式系統開發之看門狗----應用篇。

? 話說這個看門狗,還真是形象。什么個意思呢?就是一直“狗”它會盯著系統的定時器,如果定時器的時間值到了,你還沒有喂它東西的話,它肯定就不爽了,就把你的系統重啟,懲罰一下你,為啥這么久了不喂它東西吃。所以嘛,為了保持系統正常運行,就要在定時器到之前不斷的喂它東西吃,賄賂一下它。

?? 回到這個程序,為了不是看門狗叫(重啟咱們的電腦),就不斷地要從終端輸入字符來喂狗(清空定時器,讓計時值總是從0開始計數),這樣的話,就可以保持狗不會饑餓,也就不會重啟我們的電腦了。不多說了,咱們結合代碼來詳細介紹。

必要的頭文件#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
#include <getopt.h>
#include <sys/signal.h>
#include <termios.h>


struct watchdog_info{
??? unsigned int options;?? //options the card/driver supprots 19????????
??? unsigned int firmware_version;? //firmcard version of the card
??? unsigned char identity[32];???? //identity of the board 21
?};

#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_GETSUPPORT _IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) 27
#define WDIOS_DISABLECARD 0x0001??????? /* Turn off the watchdog timer */
#define WDIOS_ENABLECARD 0x0002 /* Turn on the watchdog timer */
#define WDIOC_SETOPTIONS _IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int)

int Getch (void)?? //無回顯的從屏幕輸入字符,來達到喂狗的目的
{
???? int ch;
???? struct termios oldt, newt;?? //終端設備結構體
???? tcgetattr(STDIN_FILENO, &oldt);?? //獲得終端屬性
???? newt = oldt;
???? newt.c_lflag &= ~(ECHO|ICANON);?? //設置無回顯屬性
???? tcsetattr(STDIN_FILENO, TCSANOW, &newt);? //設置新的終端屬性
???? ch = getchar();?? //從鍵盤輸入一個數據
???? tcsetattr(STDIN_FILENO, TCSANOW, &oldt);? //恢復終端設備初始設置
???? return ch;
}
?//suspend some seconds
int zsleep(int millisecond)
{
???? unsigned long usec;
???? usec=1000*millisecond;
???? usleep(usec); //睡眠usec秒
}
int Init()
{
???? int fd;
???? //open device file
???? fd = open("/dev/watchdog",O_RDWR);?? //打開看門狗設備
????? if(fd < 0)
???? {
???????? printf("device open fail\n");
???????? return -1;
???? }
???? return fd;
}

int main(int argc,char **argv)
{
???? int fd,ch;
???? int i,j;
???? char c;
???? struct watchdog_info wi;
???? fd=Init();? //打開終端看門狗設備
???? //讀板卡信息,但不常用
????? ioctl(fd,WDIOC_GETSUPPORT,&wi);
???? printf("%d,%s\n",wi.options,wi.identity);
???? //讀看門狗溢出時間,默認是5s
???? //重新設置時間為10s
???? i=5;
???? printf("%d\n",ioctl(fd,WDIOC_SETTIMEOUT,&i));
???? //讀新的設置時間
????? printf("%d\n",ioctl(fd,WDIOC_GETTIMEOUT,&i));
???? printf("%d\n",i);
???? //看門狗開始和停止工作,打開和關閉設備具有同樣的功能
???? //關閉
????? i=WDIOS_DISABLECARD;
???? printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
???? //打開
????? i=WDIOS_ENABLECARD;
???? printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
???? while(1)
???? {
?????????? zsleep(100);
?????????? if((c=Getch())!=27){
??????????????? //輸入如果不是ESC,就喂狗,否則不喂狗,到時間后系統重啟
??????????????? ioctl(fd,WDIOC_KEEPALIVE,NULL);
??????????????? //write(fd,NULL,1);???? //同樣是喂狗
?????????? }
???? }
??? close(fd);?? //關閉設備
???? return 0;
}
“小王,看清楚了嗎?這就是看門狗的應用程序,可不是你說的什么流浪狗,哈巴狗”我拍拍小王的頭說。

“看到了,只是感覺沒啥用啊,除了你向我炫耀的左右外..”小王調皮地說道。

“啊!啊! 切,我是怕你不懂,所以就沒怎么講它的用途和原理,以及實際的應用..”我嚇唬她到,“難的在下一節有關看門狗驅動的編寫上,知道不..”

“嗯..嗯,知道,你啊,一點幽默都不懂..不想跟你說了..”小王生氣的說…

“好了,不跟你耍嘴皮子啦,我還是給你說說這個程序咋用吧..”我不耐煩的說。

? 你,這樣,先gcc編譯一下,生成可執行的文件,然后下到板子上運行,這個時候你要小心啦,要不斷的按鍵盤(除了ESC),否則系統就會重啟啦,就像你開始的那樣。哈哈哈…

?

?

2010-08-24 09:52

嵌入式 看門狗

看門狗其實就是這么回事:

比如說你正在繞著一座小山裸奔。——程序按預定流程執行。

每次經過山腳下的某個地方,你都給一條大狼狗一根肉骨頭。——喂狗。

奔著奔著,你奔叉了道,跑到了不該去的山頂。——程序跑飛了。

或者,你在裸奔的途中睡著了。——程序死機。

這時,那條大狼狗,由于一直得不到喂食,餓瘋了,掙脫鎖鏈來追你。——看門狗定時器溢出。

你被它一嚇,腳底一軟,從山上咕嚕咕嚕滾下來。起來一看,靠,又回到了出發地點。于是只好又從頭開

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL中的運算符

算術運算符 MySQL 支持常見的五種算術運算&#xff1a;, -, *, /(同 DIV 函數), %(同 MOD 函數)&#xff0c;即加減乘除和取余。&#xff08;被除數為 0則結果為 NULL&#xff09; 比較運算符 當使用 SELECT 語句進行查詢時&#xff0c;MySQL 允許用戶對表達式的左邊操作數和右…

Qt中查看ui_xxx.h文件方法

前提 1、Qt當有界面 2、構造完成 滿足以上兩個條件qt會生成ui_xxx.h文件。 如何查看 方法1 在cpp文件中找到UI下的一個對象 如&#xff1a; ui->textEdit Ui::QWDialog按住Ctrl鍵&#xff0c;使用鼠標左鍵點擊UI下的一個對象&#xff0c;如&#xff1a;textEdit、QWDia…

springCloud Finchley 實戰入門(基于springBoot 2.0.3)【三 Eureka-高可用服務注冊中心】...

Eureka高可用注冊中心 Eureka Server的設計一開始就考慮到了高可用的問題&#xff0c;在eureka服務治理設計中&#xff0c;所有的節點即是是服務提供方&#xff0c;也是服務消費方。 在部署高可用注冊中心前我們先需要準備一下&#xff0c;本地環境。因為我們實例是在單臺電腦上…

Spring 讀取配置文件(二)

Spring 讀取配置文件并調用 bean package cn.com.test.receive;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class…

DaVinci的Buffer_Handle和BufTab Cmem函數調用

DaVinci的dvsdk里面&#xff0c;所有的內存用的都是CMEM&#xff0c;而比較上層的一個封裝就是BufTab和Buffer_Handle了 每個Tab可以控制好多塊內存塊。 具體到內存塊有兩種&#xff0c;一種是創建的時候指定他的大小啊&#xff0c;物理地址啥的。另外一種就是僅僅創建出這個 …

Qt使用兩組RadioButton,兩組之間相互獨立

Qt中使用兩組共四個RadioButton時&#xff0c;由于RadioButton的特性&#xff0c;所以兩組一共四個按鈕每次只能選擇一個&#xff0c;要使得兩組RadioButton相互獨立&#xff0c;需要用到QButtonGroup這個功能&#xff0c;把RadioButton加到QButtonGroup里面&#xff0c;實現兩…

sleep 和 wait 的區別

為什么80%的碼農都做不了架構師&#xff1f;>>> 面試中常問的就是 sleep 和 wait 有什么不同嗎&#xff1f;為了面試時候發揮的更好&#xff0c;我在這里總結分享下。 首先對于 sleep() 方法&#xff0c;我們首先要知道該方法是屬于 Thread 類中的。而 wait() 方法…

2016年11月13日周工作知識點總結

jQuery :eq() 選擇器選取帶有指定 index 值的元素。index 值從 0 開始&#xff0c;所有第一個元素的 index 值是 0&#xff08;不是 1&#xff09;。經常與其他元素/選擇器一起使用&#xff0c;來選擇指定的組中特定序號的元素&#xff08;如下面的例子&#xff09;。$("p…

DM6467之視頻采集(Linux)下MMAP

做&#xff44;&#xff53;&#xff50;&#xff16;&#xff14;&#xff16;&#xff17;是在linux下做視頻采集&#xff0c;僅ARM端 一共有三種視頻采集方式&#xff1a; 1&#xff09;使用read、write方式&#xff1a;直接使用 read 和 write 函數進行讀寫。這種方式最簡…

QPS、TPS計算

QPS (Query per second) &#xff08;每秒查詢量&#xff09; TPS(Transaction per second) &#xff08;每秒事務量&#xff0c;如果是InnoDB會顯示&#xff0c;沒有InnoDB就不會顯示&#xff09; 計算方法 QPS Questions SHOW GLOBAL STATUS LIKE Questions; Uptime SHOW G…

QT 中textEdit 和 textBrowser 無法使用斜體及加粗等 解決辦法

編輯框的幾個種類 QT 中一共四個文本編輯框 分別是 Line Edit 、Text Edit、 Plait Text Edit和textBrowser四種文本編輯框架&#xff01; 一、輸入內容不同 1、LineEdit&#xff1a;LineEdit的輸入內容為單行文本輸入。 2、TextEdit&#xff1a;TextEdit的輸入內容為多行文…

【select模塊】select IO多路復用和select實現FTP

select是全平臺通用的IO多路復用模塊。最大連接數&#xff1a;1024。poll和epoll沒有最大連接數限制&#xff0c;但只能用在linux平臺。selectors是再封裝模塊&#xff0c;推薦使用。下篇會討論。select.select(rlist, wlist, xlist[, timeout])This is a straightforward inte…

變量屬性

變量屬性 C語言的變量屬性 C語言中的變量可以有自己的屬性在定義變量的時候加上“屬性”關鍵字屬性關鍵字指明變量的特有意義auto關鍵字 auto即C語言中局部變量的默認屬性auto表明將被修飾的變量存儲在棧上編譯器默認所有的局部變量都是auto的register關鍵字 register關鍵字指明…

WPF:How to display a Bitmap on Image control

一個Bitmap文件&#xff0c;叫做screenShotFile, 你可以這樣顯示到Image控件上。 BitmapImage bi new BitmapImage(); bi.BeginInit(); bi.UriSource new Uri(this.screenShotFile, UriKind.Absolute); bi.EndInit(); this.scre…

QT中$$PWD的意思

$$PWD的意思為當前目錄 如pro文件中&#xff1a;INCLUDEPATH $$PWD/lib/x64-win64 $$PWD表示的意思就是pro文件所在的目錄。

Dubbo 整合 Pinpoint 做分布式服務請求跟蹤

2019獨角獸企業重金招聘Python工程師標準>>> 在使用Dubbo進行服務化或者整合應用后&#xff0c;假設某個服務后臺日志顯示有異常&#xff0c;這個服務又被多個應用調用的情況下&#xff0c;我們通常很難判斷是哪個應用調用的&#xff0c;問題的起因是什么&#xff0…

Linux 進程詳解

Linux內核的七大區間 1.進程管理&#xff08;進程創建&#xff0c;進程的三種狀態&#xff0c;進程間的調度&#xff0c;調度算法...&#xff09; 2.內存管理&#xff08;段式管理&#xff08;Linux所有段都從0開始&#xff09;&#xff0c;頁式管理--地址偏移量&#xff09; 3…

C#2.0 委托

委托 委托是一個非常不錯的設計&#xff0c;允許我們把方法做為參數傳遞&#xff0c;實現了開放閉放原則。在方法中我們只要有一個委托占位&#xff0c;調用者就可以傳入符合簽名的方法來做不同的操作&#xff0c;這也面向對象開發中多態的魅力。 但是在C#1.0的時候&#xff…

qt亂碼Could not decode“xxx.cpp“ with “UTF-8“-encoding.Editing not possible問題處理

問題描述&#xff1a;如題&#xff1a; 解決方法&#xff1a; 1、點擊Select Encoding按鈕 2、選擇按照系統編碼 3、選中System后點擊按編碼重新載入 4、問題解決

bootargs中的環境變量說明和一些常用的uboot命令

bootargs中的環境變量說明和一些常用的uboot命令 一些常見的uboot命令&#xff1a; Help [command]在屏幕上打印命令的說明 Boom [addr]啟動在內存儲器的內核 Tftpboot通過tftp啟動內核 Saveenv保存環境變量 setenv name [value] 設置環境變量 bootargs中的環境變量 co…