我正在開發一個在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的解決我原來的問題...
任何人可以給我一個建議,我怎麼能繼續嗎?
非常感謝, 邁克爾
實時系統中malloc的問題可能是碎片問題。默認的malloc既不是確定性的也不是線程安全的。分配需要可變的時間並且可能會失敗,並且如果一個線程在分配或空閒中被部分搶佔,搶佔線程然後執行分配/釋放操作,則堆管理將以不會引起顯着行爲的方式被損壞一些隨後的分配/免費。你的C庫可能有鉤子通過互斥體提供線程安全性,但這可能會進一步影響實時確定性行爲 – Clifford