2015-05-27 92 views
0

我創建以下列方式任務中的元素的列表中的任務:我怎樣才能改變最大可用堆大小爲FreeRTOS操作系統

 l = (dllist*)pvPortMalloc(sizeof(dllist)); 

DLLIST是32字節大。 我的嵌入式系統有60kB SRAM,所以我期望我的200元素列表可以被系統輕鬆處理。我發現在爲8個元素分配空間後,系統在第9次malloc函數調用(256byte +)上崩潰。

如果可能,我可以在哪裏更改freeRTOS內的堆大小? 我可以以某種方式請求堆大小的當前狀態嗎? 我無法在文檔中找到此信息,所以我希望有人能夠提供有關此問題的一些見解。 在此先感謝!

+2

*「可用堆空間的總量由'configTOTAL_HEAP_SIZE'設置 - 它在'FreeRTOSConfig.h'中定義。」* http://www.freertos.org/a00111.html(內存管理)。 –

+0

@WeatherVane:這取決於他使用的內存分配器。上次我看了這些,有4種不同的類型(並且沒有與項目需求相匹配)。 – Olaf

+0

@Weather Vane:謝謝這個設置,加上Richard提到的那些功能,讓我將解決方案引入了這個領域,我將堆大小增加到了25kB,現在它的運行平穩了。我觀察到的一件有趣的事情是,增加任務的堆棧大小也會增加可用的HEAP大小。我想知道這個的原因。 – Unfixable

回答

2

(是 - FreeRTOS的pvPortMalloc()返回void *)。

如果你有SRAM的60K和configTOTAL_HEAP_SIZE大,那麼就不太可能你要用盡堆的分配256個字節除非後你之前幾乎沒有堆。許多FreeRTOS演示只會在所有堆被使用之前繼續創建對象,所以如果您的應用程序基於其中的一個,那麼在您的代碼執行之前,您的堆將會很低。你也可以通過創建具有巨大堆棧的任務來完成諸如佔用堆空間的任務。

heap_4和heap_5將組合相鄰的塊,儘可能減少碎片,但我不認爲這會成爲你的問題 - 尤其是因爲你沒有提到在任何地方釋放任何東西。

除非你使用heap_3。c(它只是使標準C庫malloc和空閒線程安全),你可以調用xPortGetFreeHeapSize()來查看你有多少空閒堆。您也可以使用xPortGetMinimumEverFreeHeapSize()來查詢您離堆有多近。更多信息:http://www.freertos.org/a00111.html

您也可以定義一個malloc()失敗的鉤子(http://www.freertos.org/a00016.html)以獲得pvPortMalloc()的即時通知,返回NULL。

+0

我沒有使用演示代碼,我沒有做其他的分配,我的代碼使用heap_4,它也釋放了內存,但我不認爲碎片會在4x32byte mallocs後出現問題。我將使用xPortGetFreeHeapSize()並在完成之後報告,謝謝:) – Unfixable

+0

感謝使用函數,我可以找出真正的問題(如果您想知道,請參閱我的問題,下面我的問題:)) – Unfixable

1

對於標準的分配器,你會在FreeRTOSConfig.h中找到一個配置選項。

但是: 根據所使用的分配器,很可能已經耗盡內存。 IIRC有一個不釋放()任何塊(free()只是一個虛擬塊)。所以返回的任何塊都將丟失。如果您僅分配內存,這仍然很有用。在啓動時,但隨後工作與你有什麼。

其他分配器可能不會合並相鄰的塊,一旦返回,碎片增長速度比完全增長的分配器快得多。

此外,您可能會鬆散內存碎片。根據您的分配/免費模式,您很快可能會看到一堆看起來像瑞士奶酪的堆:分配塊之間有許多空洞。因此,儘管仍有足夠的可用內存,但沒有一個塊足夠大以滿足所需的大小。

如果您只分配那些大小的塊,那麼您可能會更好地使用自己的分配器或池(固定大小的塊)。 Thaqt將在啓動過程中靜態分配(例如數組)並鏈接爲鏈接列表。 Alloc/free會在堆棧上被push/pop(或者放在隊列中)。這也會非常快並且具有複雜性O(1)(如果寫入正確,則中斷安全)。

請注意,正常的malloc()/ free()不是中斷安全的。

最後:不要投void *。 (那麼,實際上這是什麼標準malloc()返回,我期望FreeRTOS變種也是如此)。

+0

我正在使用來自堆4的應該防止碎片的alloc函數,特別是如果系統在崩潰之前只分配了幾塊內存。實際上,我正在爲我的內存塊使用鏈表。 – Unfixable

+0

正常的分配器實際上不能阻止碎片,但只能減少,除非你不釋放或不使用單個塊大小。對於後者,池會更容易和更快。但是,我只看了一下可用的分配器並編寫了自己的分配器。主要是因爲我在Cortex-M中使用MPU,並且需要自然對齊的塊以及字對齊。 – Olaf

相關問題