STM32記憶體管理

2021-09-13 02:55:07 字數 2945 閱讀 9872

這是我的第一篇文章,寫的不好請多多見諒!!!(針對stm32f429來進行講解,其他型號的也可以參照學習)

相信很多新手在記憶體管理這個程式中比較疑惑,為什麼分配那麼大,可不可以更改大小?但是改大了編譯會錯誤又是為什麼?這裡將對大家心中的疑惑進行講解,並且教大家進行計算。

當該項值為 0 的時候,代表對應的記憶體塊未被占用,當該項值非零的時候,代表該項對應的內
存塊已經被占用,其數值則代表被連續占用的記憶體塊數。比如某項值為 10,那麼說明包括本項對應的記憶體塊在內,總共分配了 10 個記憶體塊給外部的某個指標。(這個是429開發指南中的話,可以不看)

下面進入主題:

三個記憶體管理表分別存在各自的記憶體池內(存在最後面):表示需要佔據記憶體;

如下:u32 mem1mapbase[mem1_alloc_table_size]; //內部sram記憶體池map

u32 mem2mapbase[mem2_alloc_table_size]attribute((at(0xc01f4000+mem2_max_size))); //外部sdram記憶體池map

u32 mem3mapbase[mem3_alloc_table_size]attribute((at(0x10000000+mem3_max_size))); //內部ccm記憶體池map

#define mem1_max_size 160*1024 //最大管理記憶體 160k

#define mem2_max_size 28958 *1024 //最大管理記憶體28912k

#define mem3_max_size 60 *1024 //最大管理記憶體60k

mem1的記憶體完全來自內部sram://程式中大小為160kb,極限為180.70kb(不考慮變數占用記憶體)。

//最大的可分配大小可以通過下面演算法進行計算,

//計算出來最大的可分配記憶體大小約為180.70kb(不考慮變數等

//記憶體的占用),但是需要留一部分給cpu給int、char等分配;

//所以咱們需要留一部分出來給cpu用,不然都編譯不出來。

//如果變數少,178k都不是問題。

#include 「stdio.h」

#define to_tal 1921024

#define b_size 64

unsigned long x,y;

int main()

return 0;

}mem2的記憶體來自sdram; //程式中大小為28912k,前面2m(其實是12808002b)給ldtc了,

//然後記憶體管理表也需要存在自己的記憶體池內,需要占用記憶體

//最後把前面的2m用1m=10241024b算,按照如下(需要把ltdc改

//成210241024)演算法得到最大的可分配記憶體為28912.94k,約等於28912k。

//而實際,ltdc只用了21280800b,所以算出來實際可供分配的

//最大記憶體為約為28958.12k,所以咱們完全可以將寫成289581024

//寫成289581024,比它小的都可以。

#include 「stdio.h」

#define to_tal 3210241024

#define ltdc 21280*800

#define b_size 64

unsigned long x,y;

int main()

return 0;

}mem2的記憶體來自ccm: //和上面的一樣,算出來約為60.23kb,所以程式裡面取60k。

//程式如下:

#include 「stdio.h」

#define to_tal 64*1024

#define b_size 64

unsigned long x,y;

int main()

return 0;

} mem3處於ccm,用於管理ccm(特別注意,這部分sram,僅cpu可以訪問!!);

需要注意的地方:

1.在一段空間中申請一段記憶體(如:陣列a)則陣列的首位址a為低位址。

2.申請記憶體都是以塊為單位申請的(例程中乙個塊64個位元組),但是如果只申請乙個位元組,

也會申請乙個塊,所以會造成很大的空間浪費,所以咱們可以適當的修改該值。

(注意:最大可以申請的記憶體大小也是跟著變,咱可以自己寫乙個可以跟著改變的程式),

下面以sdram為例提供求不同塊大小對應的利用率(可最大分配的記憶體大小)程式,

使用者可以自己選擇塊區域的大小,64是乙個比較好的分塊大小。

下面的程式,i越小表示塊的大小越小,實際利用率會越高,但分配記憶體和釋放記憶體時所

用的時間會長一點點。

注意:乙個塊2個和1個塊3個位元組不能用!!!

#include 「stdio.h」

unsigned long to_tal = 3210241024;

unsigned long ltdc = 21280800;

unsigned long x,y;

int main()

printf(「i=%d\tlast=%d\n」,i,last/1024);

last = 0;

}return 0;

}在stm32f4xx中文參考手冊:55頁!

系統 sram 可按位元組、半字(16 位)或全字(32 位)訪問。讀寫操作以 cpu 速度執行,

且等待週期為 0。

對映在位址 0x2000 0000 的 112 kb 和 16 kb 塊,可供所有 ahb 主控匯流排訪問。

對映在位址 0x2002 0000 的 64 kb 塊,可供所有 ahb 主控匯流排訪問。

在位址 0x1000 0000 對映的 64 kb 塊,只能供 cpu 通過資料匯流排訪問。

0xc01f4000=12808002;

在下學問淺薄,如果有錯誤,請指出!可以告訴在下:qq,1397436824。不勝感激。

stm32記憶體分配

原文 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似 於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配 方式類似於資料結構中的鍊錶。3 全域性區 靜態區 static 全域性變數和靜...

STM32之記憶體

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

STM32記憶體優化

這些問題都是我在做大創專案的時候遇到的問題,這次先把記憶體問題說了,下次說怎麼用 實現通訊協議的,這是我第一次寫部落格,請各位多多指正。再說之前先感謝學校老師和公司帶我的師傅的幫助,沒有他們的幫忙很那開展除錯。我用的是stm32f103c8t6,flash是128k,ram是20k,只要是涉及演算法...