2016-09-06 470 views
1

我正在開發一個在uCOS-III下使用的C庫。 CPU是ARM Cortex M4 SAM4C。在圖書館內,我想使用第三方產品X,其名稱與此無關。 X的源代碼完全可用,編譯時沒有問題。uCOS-III下的內存分配

在X內部使用calloc()和free()執行大量內存分配。 問題是,由於內存碎片,malloc的普通用法不適用於嵌入式系統。 uCOS-III的文檔明確建議不要使用malloc - 而應該使用OSMemCreate/OSMemGet/OSMemPut來分配和釋放靜態分配的內存塊中的內存塊。

問題1:

什麼是一般建議得到解決的malloc的「標準執行」?我寧願樣的malloc,在那裏我有機會獲得一個固定的內存池(例如專用於特殊任務)

問題2:

應該如何OSMemCreate()正確使用?我首先要用特定的塊大小初始化一個內存分區。請求的內存量在4字節到800字節之間。我可以根據要求獲得大塊,但是大小固定。如果block-size = 4,我不能分配16個字節,因爲塊在內存中不是連續的。如果block-size = 800並且我只需要4個字節,那麼大部分塊都沒有使用,我很快就會用完塊。

所以我不知道如何使用OSMemCreate的解決我原來的問題...

任何人可以給我一個建議,我怎麼能繼續嗎?

非常感謝, 邁克爾

+0

實時系統中malloc的問題可能是碎片問題。默認的malloc既不是確定性的也不是線程安全的。分配需要可變的時間並且可能會失敗,並且如果一個線程在分配或空閒中被部分搶佔,搶佔線程然後執行分配/釋放操作,則堆管理將以不會引起顯着行爲的方式被損壞一些隨後的分配/免費。你的C庫可能有鉤子通過互斥體提供線程安全性,但這可能會進一步影響實時確定性行爲 – Clifford

回答

2

1)不要使用malloc /免費的標準庫版本鏈接。相反,創建自己的malloc/free實現,作爲OSMemGet/OSMemPut的包裝。

2)您可以使用OSMemCreate創建多個內存分區。創建小型,中型和大型分區,保留爲您的應用程序調整的塊大小,以減少浪費。

如果你想讓malloc從你的各種內存分區中獲得一個合適大小的塊,那麼你將不得不發明一些神奇的東西,以便將塊返回到合適的內存分區。 (也許malloc分配一個額外的單詞,將指針存儲在第一個單詞中的內存分區,然後返回存儲指針後的單詞的地址,然後free知道從前面的單詞獲取內存分區指針。)

使用malloc/free的替代方法是重寫該代碼以使用靜態分配的變量或直接調用OSMemGet/OSMemPut。

+0

這個提示非常棒;-)我實現了它,就像你的建議,它工作得很好。 – michael