關於任務棧和系統棧的基礎知識,可以參考之前的隨筆。(點擊這里)
這里再次說明:#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
這個宏,官方文檔解釋:
FreeRTOS堆中可用的RAM總量。
只有在configSUPPORT_DYNAMIC_ALLOCATION設置為1並且應用程序使用FreeRTOS源代碼下載中提供的一個示例內存分配方案時(heap1,2,3,4,5.c源文件,這里我使用的是heap4),才會使用此值。有關詳細信息,請參閱內存分配部分。
我全局搜索工程,並沒有發現configSUPPORT_DYNAMIC_ALLOCATION這個宏,然后,直接看官方解釋:
現在我們知道了,這個宏不定義,默認是1,即啟用狀態。
具體的configTOTAL_HEAP_SIZE 需要分配多大,確實沒有一個簡單可行的方式,但是,當我們遇到程序莫名崩潰或者卡死的時候,先試試把configTOTAL_HEAP_SIZE 的大小增大試試看。就在上一個項目中,我增加了一個任務中的幾百行代碼,然后發現我的系統會出現崩潰情況,我試着把
任務棧從512提高到1024,依然還是出現崩潰,再然后,我明白不是任務棧的大小問題,但應該就是某個內存分配出了問題(當然,這是建立在我已經檢查過代碼沒有非法操作的情況下),最后,我試着把configTOTAL_HEAP_SIZE 改成20* 1024,果然,立馬系統正常運行了。
這說明確實是RAM不夠用了,特此記錄。
期間還遇到了一個問題,keil 5.20中,使用結構體內存強制一字節對齊之后,出現訪問數據錯誤。一個全局變量的結構體,第一個元素默認是0,但是我取出來訪問居然是一個隨機值。例子和具體解決方法待續。。。