當前位置:
首頁 > 最新 > 狗蛋的尋親之路,結識嵌入式世界的那隻狗

狗蛋的尋親之路,結識嵌入式世界的那隻狗

1

問題來源

Linux企鵝Tux最近很煩。

因為狗蛋最近開始操刀linux下的外設驅動了。但是奈何狗蛋基本功很差,代碼bug很多,寫完後在板子上實測後發現剛開始還能進系統balabala的搗鼓一會兒,感覺甚是良好,但是過一會兒,系統就掛掉了,沒有反應,只能大眼瞪小眼。狗蛋每次都需要強制拔掉電池然後重新開機。但是每次斷電後各種異常狀態也保存不了,更不用說如何才能找到那些隱蔽的蟲子。

所以,明明Tux提供給了狗蛋這麼好的一個穩定的OS系統,偏偏遇到一個豬一樣的隊友寫的程序,Tux真的很無奈。終於有一天它看不下去了,決定幫助狗蛋解決下他的問題,那麼狗蛋實際要解決什麼問題呢?

1)不用每次把系統搞死後都要手動扣掉電池或電源才能重啟。

2)可以儘快的找到那些隱蔽的bug。

2

軟體方案

為了解決以上需求,Tux張貼了皇榜需求,好在Tux的粉絲那是相當的多啊,振臂一揮,需求實現者很快就實現了這個需求:

基本思路就是給Tux僱傭一個很競職盡責的狗,因為它被賦予守衛家園的重任,所以Tux親切的稱之為看門狗(watchdog),不是哈巴狗,也不是泰迪狗,更不是流浪狗。這隻看門狗的工作就是幫助Tux監控OS的世界是否正常運作。當然看門狗不是白乾活的,你得給它點好處,但是它的要求也不高,Tux只需要每隔一段時間給它喂點好吃的東西就行,看門狗就會為Tux守衛一方寧靜。

否則一旦時間太久沒有餵食它,那麼這隻狗狗就認為Tux的世界又被哪個鳥蛋搞的不能正常運作了。於是看門狗就灰常生氣,當然後果很嚴重啦,按照和Tux之前的約定不管三七二十一直接重啟OS,誰也賄賂不了它。當然在重啟之前,看門狗為了幫Tux抓住是哪些蟲子把這個Tux的世界搞掛掉的,它還特意收集了一些當時現場的各種情報信息(堆棧信息),以便Tux的隊友狗蛋能夠儘快的根據這些情報抓住bug,還Tux一個清凈安穩的世界。也好讓懵逼的狗蛋能夠更進一步。

下面我們看一看Tux的粉絲給狗蛋的看門狗解決方案:

上面的流程很清晰:

前置條件:

設定看門狗:申明一個軟體定時器。

設定看門狗超時重啟時間:timout。

啟動定時器記時。

用戶進程或內核線程在

結果:

遇到狗蛋豬一樣的隊友寫的程序生產了很多BUG,軟體異常,系統死掉。喂狗動作被迫中止,收集異常信息,重啟OS。

Tux覺得這個方法很不錯,由於完全使用軟體實現,所以親切的稱之為軟體看門狗。同時把它介紹給了狗蛋,還真別說,自從狗蛋拉攏了看門狗這個親戚後,幹活效率那是杠杠的。即使系統掛掉了,但是它親戚很給力啊,直接dump_stack然後restart OS。狗蛋再根據堆棧信息以下就把那些隱蔽的蟲子給一一擊斃了。Tux終於有閑心坐下喝杯咖啡,養養神了。

但是好景不長,有一天狗蛋又遇到了系統死掉,但是很奇怪的是看門狗並沒有按照既定的約定重啟OS,狗蛋頗為惱火,但是束手無策啊。「不知道Tux的OS又在搞什麼幺蛾子。」於是狗蛋又屁顛屁顛的去和Tux溝通。還沒等狗蛋開口。Tux就開口了:「不用說了,如果我沒猜錯的話,你想問你的親戚是不是罷工了?」

「我靠,你丫神算啊,小弟佩服啊!」狗蛋一臉的崇拜樣。

「別拍馬屁了,這次的情況有點複雜,你遇到的問題,我的粉絲也已經遇到過了,而且通過他們的定位分析,得出一致的結論:軟體看門狗有缺陷,不足以覆蓋所有的異常情況。比如匯流排卡死,硬體故障等,這種情況會導致使用的軟體看門狗定時器發出的中斷CPU端接收不到從而致使timer無法正常工作而失效。所以對於這種情況我已經知會了各路友商:為了避免系統在無人干預時長時間掛起的情況,尤其是嵌入式系統,僅靠軟體看門狗是不行的,我們還需要一個硬體看門狗來保家護航。」

3

硬體方案

顧名思義,硬體看門狗是相對於軟體看門狗來說的。軟體看門狗是用一個軟體的定時器來實現的。而硬體看門狗呢?它是在SOC/MCU內部增加了一個可以被複位的硬體計數器模塊,當看門狗啟動後,計數器開始自動計數,經過一定時間,如果計數沒有被複位,計數器達到指定數值就會發出複位信號,很多設備包括CPU接到這個信號而複位重啟(俗稱「被狗咬」)。為了保證看門狗不發出複位信號,就需要在看門狗允許的時間間隔內給我們的夥伴餵食,即對看門狗計數器清零(俗稱「喂狗」),計數器重新計數。如果系統正常並保證按時「喂狗」,那麼一切太平相安無事。一旦遇到狗蛋這樣豬一樣的隊友寫的程序導致故障系統卡死沒有「喂狗」,系統也能「被咬」複位。

其實原理和軟體看門狗是一樣的,區別就在於此處專門用一個硬體模塊替代,它可以做到即使遇到匯流排卡死,硬體故障問題依然可以獨立工作,重啟系統。

那麼根據這個功能,Tux又發布了一條需求公告:要想嵌入式系統穩定可靠,最好設計硬體WDT(看門狗定時器),WDT需要有如下功能:

1.提供控制寄存器和配置寄存器,供嵌粉根據系統需要進行靈活配置,例如時鐘分頻因子,禁止使能WDT/INT/RESET,超時時間設置等。

2.提供一介面,使應用軟體能夠定時給WATCHDOG「喂狗」,即計數功能。

3.提供WATCHDOG機制,當系統進入不可恢復錯誤時,能產生一個不可屏蔽中斷來通知系統自動重啟,只有相應的複位信號才能清除它。即硬體複位信號重啟系統功能。

Tux不僅在軟體界吃香,在硬體界那也是杠杠的,誰叫嵌入式系統用咋OS的多呢?有需求就有市場,皇榜一出,那些晶元廠商三下五除二就搞定這個簡單的模塊,我們看下三星S6 exynos7420晶元內部集成的WDT

WTCON:控制寄存器,設置相關分頻因子,使能重啟,中斷等。

WTDAT:數據寄存器,超時參數設置。

WTCNT:計數寄存器,喂狗用。

軟體上只需要配置好硬體看門狗的參數,然後使能就行了,看門狗就可以忠心的為我們護衛我們的家園了。一旦出現異常,WDT就超時觸發中斷並複位。

「嘖嘖,這條進化的狗才真正的高大上嘛,不錯不錯,不愧為狗中神犬。我得趕緊去養一條。」很快狗蛋就從某寶上淘了一塊帶有硬體WDT功能的板子,開始他的啪啪啪捉蟲之路。話說自從養了這條神犬後,狗蛋再也沒有來煩Tux了,看來一人一狗相處的很high啊。

4

軟體框架實現

在Tux的世界中,有用軟體看門狗,有用硬體看門狗,而不同的廠家硬體看門狗的設計又是不一樣的,Tux為了做到軟體的分層架構和通用性。於是統一了相關的watchdog介面,我們來看看如何實現一個WDT驅動:

1)在具體的watchdog驅動裡面申明包裹watchdog_device結構體的變數。

2)實現watchdog_device結構體的info,ops成員。

3)調用通用介面watchdog_register_device註冊misc混雜設備。

調用此介面後,混雜設備會關聯如下的file ops,同時會生成/dev/watchdog設備節點。

這樣應用層就可以通過此設備節點進行踢狗監控程序是否掛掉。

4) 實現依賴硬體的功能。

配置控制寄存器,超時時間,中斷重啟邏輯等。當然為了抓取異常情況我們可以在WDT超時中斷裡面搜集寄存器堆棧等各種log信息方便debug。

5)在用戶空間或內核空間實現踢狗監控。

在我們開發過程,內核啟動時候如果長時間執行一個好時很長的功能比如觸摸屏固件升級,需要主動調用踢狗函數防止WDT超時重啟。

這裡,我們又領略了一次linux內核的分層結構思想,分離出重複的代碼邏輯。增加了代碼的通用性和易用性。所以嵌粉們以後在內核裡面編程的時候一定要經常和Tux溝通,說不定他會為你找出更容易的解決方案,讓你事倍功半。

好了,Tux終於可以安心的去南極找尋他兒時的小夥伴了,好雞凍啊。這次狗蛋也應該可以和他的看門狗朋友愉快的玩下去了,而相信有了看門狗的幫助,狗蛋又能向成功邁進了一步,那麼通過這篇文章的若干個知識點,我的嵌粉朋友們,你呢?

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 碼農職場加油站 的精彩文章:

TAG:碼農職場加油站 |

您可能感興趣

被燒烤的香味吸引過來的狗狗,不曾想因為它結識了現任女友
我的網戀老公是我親哥哥,網路結識的愛情投入要看現實
什麼面相的人命犯桃花,易結識異性
讓狗狗結識家庭中的其它朋友
奇蹟發生了!她居然通過這種方式結識了最好的朋友
不要以為結識了圈子裡的人,你就進了圈子
海賊王:盤點那些路飛在冒險中結識的朋友,第一個就是她
原來這三個星座會在狗年結識真愛,從此成雙入對!
此人賣草鞋,結識了一個通緝犯,一個殺豬佬,參軍征戰當了皇帝
狗狗總喜歡出門,後來才知道,原來是在外面結識了「豬隊友」
本月結束,會遇到真愛結識有緣人的三大星座,掉入蜜罐!
英國「托狗所」半日制,狗狗能夠在這結識朋友和學習或是鍛煉
一個賣草鞋的,卻因結識兩個普通兄弟,最後卻走運成了皇帝
室友為你做過最感動的事,結識得一位這樣的摯友夫復何求
她在最落魄時結識潘粵明,洗碗仔細卻被批浪費水,美的獨一無二
去公園溫習功課卻意外結識一隻貓,離開的時候沒忍住,一起帶走了
深度調查:在澳中國女留學生易遭孤立,難以結識當地朋友,「她們給了我一個白眼,之後轉身離開」
二哈結識了鄰居家貓咪之後,出現一些詭異行為,細看笑噴!
三月底,桃花遍地開,會結識良緣的三大星座,一定甜蜜!
結識貴人,財氣纏身的三大星座,銀行里的存款翻幾番!