2009-07-27 52 views
3

我有一個運行在ARM uC上的VxWorks應用程序。如何確定一個任務破壞的原因,VxWorks?

首先讓我總結一下這個應用程序;

應用程序由第三方堆棧和網關應用程序組成。 我們已經實現了一個操作系統抽象層來支持操作系統依賴。

底層堆棧有自己的內存管理&控制工具,它將內存塊保存在一個雙向鏈表中。

例如;我們不直接執行malloc/new,free/delege。相反,我們調用OSA圖層的例程,它從OS獲取內存並將其放入列表中,然後將此內存返回給應用程序(例程:XXAlloc,XXFree,XXReAlloc)

當釋放內存時,我們再次使用XXFree。

其實這一塊是具有

-Magic數字指示開始和內存塊 -size用戶要求源於對齊問題是一個和下一個指針 分配 -size在現實中的末端結構 - 返回給應用程序的指向內存塊的指針。鏈接寄存器顯示應用程序xxAlloc被調用的位置。

使用此塊結構堆棧可以檢查塊是否損壞。

這是從Linux的,我們用它來 -create移植同樣,我們也pthread庫/終止線程(目前有22個線程) -synchronization對象(事件,互斥..)

有主要任務由taskSpawn調用,隨後此任務創建其他線程。

這是對應用程序及其VxWorks接口的描述。

的問題是:

任務中的一個突然被通過的VxWorks沒有給出關於什麼是錯的信息銷燬。 我也有一個jtag調試器,它碰到了VxWorks的taskDestoy()例程,但調用堆棧不會給出任何信息,既不是PC或r14。

我懷疑在代碼的特定程序,用戶龐大的xxAlloc完成,但出現問題 非常分散給不知道,我可以把它映射到源代碼。

我認爲操作系統檢測到異常並且默默執行它的處理。

任何幫助將是巨大的

問候

+1

建議重新格式化問題一下:在開始和後面的信息問題陳述。這樣讀者就不需要閱讀整個故事來了解它是否匹配。 – Adriaan 2009-08-06 08:05:19

回答

1

它解決了。

我做了一個單獨的測試。用malloc和memset分配20MB與0x55,並停止我的應用程序的線程。

而且我寫了另一個線程,它檢查我的20MB是否寫入了除0x55以外的任何數據。

還有什麼!一些其他線程屬於CPU中的其他組件(別人開發它們)寫入我分配的空間。

謝謝4您的幫助

0

如果你的任務退出,taskDestroy()被調用。如果您懷疑存在巨大的xxAlloc,請確認分配代碼在內存耗盡時未調用exit()。之前我在第三方OSAL中被這種行爲困擾過。

+0

嗨 代碼沒有exit()。 Thnx – tguclu 2009-07-28 10:56:00

+0

其他類似的可能性是任務的入口點只是簡單地返回。 (或者類似退出的函數被稱爲... abort()?) 我也在堆棧損壞或堆棧溢出的情況下看到了這種行爲。 – bstpierre 2009-07-28 13:24:03

0

聽起來像你在集成後正在調試;這可能是一個工作的地獄。 我建議把問題分解成小塊。

過程

1)可以通過插的代碼和/或使用的VxWorks intrumentation得到更深入的瞭解(取決於哪個版本)。這可以讓您更清楚地瞭解發生的情況。確保將所有內容都記錄到文件中,以便從任務結束的時間點後退。儀器儀表是值得的投資,因爲它可以在更多場合使用。 VxWorks中有趣的掛鉤:Taskhooklib

2)內存分配/取消分配是非常基本的功能。這將是我在定義明確的多線程環境中徹底(單元)測試的第一個候選人。如果你已經做到了這一點,並且沒有發現錯誤,我首先會開始考慮爲什麼tas已經結束。

其他可能的原因

當工作完成的任務也將結束..所以它可能是由一個沒有如此無限循環回報。特別是如果它始終是相同的任務,這將是我的猜測。

VxWorks的某些版本必須考慮MMU支持。