2012-05-23 42 views
2

我們使用Micrium的μC/ OS-III RTOS和瑞薩RX62N。MicriμmμC/ OS-III RTOS中的分配和免費

我們建立了一個系統,我們必須動態地分配和釋放數據。我們發現函數malloc()免費()與RTOS不能很好地工作。 但是RTOS爲此有一個自定義函數; Mem_HeapAlloc()函數。 這個函數分配一些RTOS'製成'堆'的內存。問題在於它沒有免費的功能,可能是因爲一切都進入了堆池

在實時操作系統中也可以建立一個池。這個池的問題是所有包含的塊都需要具有相同的大小。由於我們正在分配和釋放不同的尺寸,這對我們來說不是一個好的解決方案。

我們發現了一個描述存儲器RTOS功能的文檔,第4章描述了這些功能。

有人知道我們如何解決這個問題嗎?

一些解決方案,我們有媒體鏈接

  • 讓所有的塊尺寸相同,最大的分配。 我們有很多開銷,因爲最小和最大的分配差別很大。
  • 不要做一個免費的。 這是沒有解決辦法,會有內存泄漏。

希望有人能幫助我們。如果事情是不明確的,請讓我

在此先感謝

回答

2
  • you can allocate your objects in multiples of block sizes.

你仍然會有一些內部的碎片,你將無法充分利用可用空間,由於它。

你仍然會使用內存池以下優點

  • 內存池允許恆定的執行時間(不分段)的內存分配。池中數千個對象的內存釋放只是一個操作,如果malloc用於爲每個對象分配內存,則不是一個一個操作。

  • 內存池可以組織成層次樹結構,適用於特殊的編程結構,如循環和遞歸。

  • 固定大小塊內存池不需要爲每個分配存儲分配元數據,描述像分配塊的大小這樣的特徵。特別是對於小型分配,這可節省大量空間。

+1

我們正在爲結構分配空間,所以分配必須繼續。 – Hendrik

+1

我想這將是堆管理員的責任,你正在使用拆分你的結構在多個對象中的分配。 – ravi

+1

我們並沒有真正使用堆管理器,只是由RTOS功能提供空間,並且這些空間不保留任何管理。 – Hendrik