2017-06-21 249 views
-1

我正在讀取dsPIC30F6014A上ADC通道的一些數據。 爲此,我爲每個ADC實現了一項單獨的任務(比如說7個通道-7個任務)。
我已經在開始時創建了所有任務,我的堆大小爲5120,我使用heap_4.c,並且我爲每個任務分配了堆棧configMINIMAL_Stack(即115)。
這些任務正在連續和定期運行(只是vTaskSuspend()vTaskResume()是我在做什麼)
在開始時,所有任務工作正常,但經過一段時間vApplicationStackOverflowHook()發生,即堆棧溢出。freertos中的堆棧溢出

是否有任何錯誤處理內存的可能性?

+1

顯示您的代碼。 https://stackoverflow.com/help/how-to-ask – Tschallacka

回答

3

根據ADC輸入創建任務似乎很浪費。除閱讀ADC之外還有什麼其他任務呢?

我猜你的任務非常接近它的堆棧邊緣,並且在某個時刻,恰好當你處於最大堆棧深度並導致溢出時,恰好會發生中斷。您可以定期致電uxTaskGetStackHighWaterMark()以確定您到達堆棧的末端有多接近。

+0

該應用程序是一種安全應用程序。而對於PIC中的ADC採樣,我正在輪詢DONE位,所以控制器在輪詢時存在輕微的可能性。這就是爲什麼我實施了不同的任務。如果我在需要時創建並刪除任務,該怎麼辦呢?它是否釋放了任務佔用的內存,以便我可以將該內存分配給另一個任務????謝謝 –

+0

在「安全應用程序」中動態分配內存不推薦!正如理查德所說,它可能是一箇中斷髮生並將堆棧超過極限,或者存在一個通過任務代碼的路徑,它比平常使用更多的堆棧。無論如何,簡單的解決方案是增加堆棧大小(每個ADC任務的大小)。最小堆棧大小可能不足以滿足您的要求。這就是說,如果你可以在一個任務中完成這一切,那麼你可以有一個更大的堆棧,並仍然使用更少的內存(和更好的性能) –

+0

謝謝,前段時間我通過打印pcTaskName來檢查哪個任務進入hook液晶顯示器,它顯示「IDL」,所以現在我有點困惑,如何理想的任務使用多少堆棧(糾正我,如果我錯了)?除此之外,我的堆是5120,所以我可以創建多少個任務,以及最小堆棧大小?每次當我暫停任務並恢復另一個任務時,每次都會佔用新的內存?????謝謝。 –