2013-05-08 151 views
3

我目前有問題,我認爲是在STM32F407目標上運行FreeRTOS時配置錯誤的堆棧損壞。FreeRTOS - STM32F4上的堆棧損壞

我看過FreeRTOS stack corruption on STM32F4 with gcc,但沒有得到任何幫助。

該應用程序運行兩個任務,並依靠一個CAN中斷。工作流程如下:

  1. 兩個任務network_task和app_task與兩個隊列raw_msg_queue和app_msg_queue一起創建。 CAN中斷也被設置。
  2. network_task具有最高的優先級,並開始無限期地等待raw_msg_queue。
  3. app_task接下來開始等待app_msg_queue。
  4. 然後由於外部事件觸發CAN中斷,並將一條CAN消息添加到raw_msg_queue。
  5. network_task喚醒,處理消息,將處理後的消息添加到app_msg_queue,然後繼續等待raw_msg_queue。
  6. app_task醒來,我得到一個硬性故障。

問題在於,由於最終用戶的便利性和可移植性,我已經將app_task對xQueueReceive所做的調用分兩步打包。 app_task總功能鏈是它調用network_receive(..) - > os_queue_receive(..) - > xQueueReceive(..)。這很好,但是當它從xQueueReceive(..)返回時,它只會返回到os_queue_receive(..),然後它返回到一個看似隨機的內存位置,並且我得到一個硬性故障。

堆棧大小應該足夠,並且都設置爲2048,所有大型數據結構都作爲指針傳遞。

我在兩個STM32F407上運行我的代碼。 FreeRTOS版本爲7.4.2,是本文撰寫時的最新版本。

我真的希望有人能幫助我在這裏!

回答

1

首先,您可以看看here並嘗試獲取有關硬故障的更多信息。 您可能還想檢查您的中斷優先級設置,因爲棘手的ARM Cortex-M中斷優先級機制會在FreeRTOS中造成一些麻煩。請參閱here

1

我知道這個問題相當老,但也許這可能會幫助其他人面臨類似的問題。在FreeRTOS操作系統,你可以利用

void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)

功能來檢測堆棧溢出,並抓住有關問題的任務培訓相關信息。數據可能因溢出而損壞,但至少可以解決發生溢出(重置系統,設置錯誤標誌/ LED等)的事實

對於這個特定的問題,我會好奇的查看線程初始化代碼以及中斷例程。如果問題實際上是一個溢出,我認爲調整這些參數相當簡單,直到問題消失。你提到2048個字節應該足夠用於每個線程 - 如果確實如此,我懷疑問題是溢出。在那個時候,你更有可能將一個懸掛的指針解引用到一個陳舊的內存地址。