2009-04-30 66 views
2

我有一個嵌入式系統,有多個(> 20)任務運行在不同的優先級。我還有一個看門狗任務,用來檢查所有其他任務沒有卡住。我的看門狗正在工作,因爲每過一次藍月亮,它都會重啓系統,因爲任務沒有檢入。如何確定哪個任務已經死了?

如何確定哪個任務死了?

我不能責怪最老的任務來踢這個看門狗,因爲它可能被一個沒有屈服的高優先級任務阻擋。

有什麼建議嗎?

回答

2

每一個任務看門狗要求更高優先級的任務產生了足夠的時間,使所有可踢的看門狗。要確定哪個任務存在問題,您必須找到捱餓的人。您需要在看守程序檢查之間測量任務執行時間以查找實際的罪魁禍首。

1

這是先發制人的嗎?我會這樣認爲,否則如果其中一個人陷入困境,看門狗任務就不會運行。

您沒有提到操作系統,但是如果看門狗任務可以檢查單個任務是否未簽入,則必須在每個任務與看門狗之間有單獨的通信通道。

您可能需要修改看門狗以某種方式轉儲未檢查的任務號轉儲任務控制塊和內存,以便您可以進行驗屍。

根據操作系統,這可能很容易或很難。

0

根據您的系統和操作系統,可能有不同的方法。我使用的一種非常低級別的方法是在每個任務正在運行時使LED閃爍。您可能需要在LED上安裝示波器才能看到非常快速的任務切換。

0

對於一箇中斷驅動的看門狗,您只需讓任務切換器在每次更改時都更新當前正在運行的任務編號,從而可以確定哪一個沒有屈服。

但是,你建議你自己編寫看門狗作爲一個任務,所以在重新啓動之前,看門狗肯定能夠識別飢餓的任務?您可以將其存儲在內存中,該內存可以在溫熱重啓之後保留,也可以通過調試接口發送。與此相關的問題是飢餓的任務可能不是問題的任務:您可能想知道最後幾個任務開關(和時間)以確定原因。

0

餐巾方法的簡單化,背會是這樣的:

int8_t wd_tickle[NUM_TASKS] 

void taskA_main() 
{ 
    ... 
    // main loop 
    while(1) { 
    ... 
    wd_tickle[TASKA_NUM]++; 
    } 
} 

... tasks B, C, D... follow similar pattern 

void watchdog_task() 
{ 
    for(int i= 0; i < NUM_TASKS; i++) { 
    if(0 == wd_tickle[i]) { 
     // Egads! The task didn't kick us! Reset and record the task number 
    } 
    } 
} 
+0

問題是B的優先級高於A.B被鎖定,但A不會啓動看門狗。 A被指責爲B的鎖定。 – Robert 2009-04-30 18:06:34

2

即使我最近幾周在看門狗復位問題上工作。但幸運的是,對於我的ramdump文件(在ARM開發環境中),它有一箇中斷處理程序跟蹤緩衝區,每個中斷包含PC和SLR。因此,從跟蹤緩衝區中,我可以精確地找出在WD重置之前哪部分代碼正在運行。

我想如果你有相同的存儲PC機的種類,SLR在每次中斷的話你就可以精確地找出罪魁禍首了。

0

您的系統如何正常工作?我總是使用軟件和硬件看門狗的組合。讓我解釋...

我的例子假設你有一個搶佔實時內核工作,你有你的CPU /微控制器的看門狗支持。如果在一定時間內未被踢出,該監督員將執行重置。要檢查兩件事情:

1)週期性系統定時器(「RTOS時鐘」)正在運行(如果沒有,像「休眠」功能將不再工作,您的系統不可用)。

2)的所有線程可以運行withing的一段合理的時間。

我的RTOS(www.lieron.be/micror2k)提供了在RTOS時鐘中斷處理程序運行代碼的可能性。這是刷新硬件看門狗的唯一地方,所以您確定時鐘一直在運行(如果不是看門狗會重置您的系統)。

在空閒線程(總是以最低優先級運行),「軟件看門狗」被刷新。這只是將變量設置爲某個值(例如1000)。在RTOS時鐘中斷(踢硬件看門狗的地方)中,可以遞減並檢查該值。如果它達到0,這意味着空閒線程沒有運行1000個時鐘滴答並重新啓動系統(可以通過在中斷處理程序內無限循環來讓硬件看守程序重新啓動)完成。

現在爲您的原始問題。我假定系統時鐘一直運行,所以它是重置系統的軟件看門狗。在RTOS時鐘中斷處理程序中,您可以執行一些「統計信息收集」,以防軟件看門狗情況發生。您可以在每個時鐘週期(發生問題後)看到正在運行的線程,而不是重新設置系統,並嘗試瞭解發生了什麼。這並不理想,但它會有所幫助。

另一種選擇是在不同的優先級添加多個軟件看門狗。使空閒線程將VariableA設置爲1000,並且具有(專用)中等優先級線程集變量B.在RTOS時鐘中斷處理程序中,檢查兩個變量。有了這些信息,您就知道循環線程的優先級高於「中」或低於「中」。如果你希望你可以添加你喜歡的第三或第四或多少軟件看門狗。最糟糕的情況是,爲每個使用的優先級添加一個軟件看門狗(雖然會花費盡可能多的額外線程)。

相關問題