跟著原子學習stm32之記憶體管理

2021-07-11 02:01:08 字數 1688 閱讀 8889

學習stm32有2年的時間了,但是也只是有些基礎的了解。為了深入的學習stm32應用,從新拿起原子寫的《stm32開發指南》來深入的學習,所以這裡太基本的東西不講。文中有可能會搬一些原子大神的東西。另外這個系列只作為我自己的不完整筆記,畢竟原子大神寫的很完整了!已經本人用的是神舟三號開發板。

首先先無恥的把原子的筆記粘過來一大堆。

記憶體管理,是指軟體執行時對計算機記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和**記憶體資源。記憶體管理的實現方法有很多種,他們其實最終都是要實現 2 個函式: malloc 和 free; malloc 函式用於記憶體申請, free 函式用於記憶體釋放。

記憶體管理的實現原理

從上圖可以看出,

分塊式記憶體管理由記憶體池和記憶體管理錶兩部分組成

。記憶體池被等分為 n塊,對應的記憶體管理表,大小也為 n,記憶體管理表的每乙個項對應記憶體池的一塊記憶體。記憶體管理表的項值代表的意義為:

當該項值為 0 的時候,代表對應的記憶體塊未被占用,當

該項值非零的時候,代表該項對應的記憶體塊已經被占用

,其數值則代表被連續占用的記憶體塊數

。比如某項值為 10,那麼說明包括本項對應的記憶體塊在內,總共分配了 10 個記憶體塊給外部的某個指標。

內寸分配方向如圖所示,是從頂

底的分配方向

。(即從高位位址到低位位址)即首先從最末端開始找空記憶體。當記憶體管理剛初始化的時候,記憶體表全部清零,表示沒有任何記憶體塊被占用。

分配原理

當指標 p 呼叫 malloc 申請記憶體的時候,先

判斷 p 要分配的記憶體塊數

( m),然後從第 n 項開始,向下查詢,直到

找到 m 塊連續的空記憶體塊

(即對應記憶體管理表項為 0),然後

將這 m 個內

存管理表項的值都設定為 m

(標記被占用),最後,把

最後的這個空記憶體塊的位址返回指標 p

,完成一次分配。注意,如果當記憶體不夠的時候(找到最後也沒找到連續的 m 塊空閒記憶體),則返回 null 給 p,表示分配失敗。

釋放原理

當 p 申請的記憶體用完,需要釋放的時候,呼叫 free 函式實現。 free 函式先

判斷 p 指向的內

存位址所對應的記憶體塊

,然後找到對應的記憶體管理表專案

,得到 p 所占用的記憶體塊數目 m(記憶體管理表專案的值就是所分配記憶體塊的數目),

將這 m 個記憶體管理表專案的值都清零

,標記釋放,完成一次記憶體釋放。

關於記憶體管理的解讀

記憶體管理實際上就是讓系統的記憶體能夠規整化。對於小的專案來說沒那麼嚴格,可能記憶體管理不重要,對於大系統記憶體管理可以有效管理,並利用記憶體,防止記憶體浪費。

通過記憶體管理可以把某些變數的值集中儲存,而不是通過系統自己自動分配。

實際上就是自己建立了乙個堆,然後對他進行操作。

在自己做實驗時有乙個地方要注意,就是針對釋放原理中說的施放的話,只要把記憶體管理表中的數值清零就可以了。這樣就代表這個記憶體塊是沒有占用的,不用把記憶體塊中內容清零。這也就是為什麼在做分配時,查詢記憶體塊時只看管理表中的內容做判斷!

內容太少,但也就這樣,如有不對,歡迎指正!

STM32之記憶體

記憶體的分類 1 動態記憶體 dram。為什麼稱之為動態記憶體呢?是與他的硬體構成有關。動態隨機儲存器dram 的記憶體單元是以電容的電荷來表示資料。有電荷表示1,無電荷表示0,但是隨著時間的推移,代表1的電荷會放電,代表0的電荷會吸收電荷,因此它需要定期重新整理,所以就有了動態記憶體之稱。重新整理...

stm32正點原子學習筆記(28)外部中斷

同一時間,只能有乙個io口對映到中斷線,例如,當pa0做了外部中斷0時,pb0等就不能作為外部中斷0了。3 按鍵初始化函式 4void key init void io初始化520 21 unsigned char key scan unsigned char mode 2233 else if k...

STM32之記憶體分布與匯流排

系統包括乙個由多個互相連線的32位ahb匯流排組成的矩陣 cortex m4 with fpu core i bus,d bus and s bus dma1 memory bus dma2 memory bus dma2 peripheral bus ethernet dma bus usb ot...