stm32(X)に基づくメモリ管理

1.はじめに

1.機能

メモリ管理とは、ソフトウェアの実行中にコンピュータのメモリリソースを割り当てて使用するテクノロジーのことです。その主な目的はようである適切な時期にどのように効率的かつ迅速な割り当てと解放とメモリリソースの回復。

2.コンセプト

メモリ管理を実装する方法はたくさんありますが、実際 は、最終的にはmalloc freeの2つの 関数 を実装する必要があります。  

malloc  関数は、メモリアプリケーションに使用されます。

解放 機能はメモリ解放に使用されます。 

上の図からわかるように、ブロックベースのメモリ管理は、メモリプールとメモリ管理テーブルの2つの部分で構成されています。メモリプールは n個のブロックに 均等に分割され、対応するメモリ管理テーブルもサイズn であり、メモリ管理テーブルの各項目はメモリプール内のメモリに対応しています。
メモリ管理テーブルのアイテム値の意味は次のとおりです。このアイテムの値が 0の 場合、対応するメモリブロックが占有されていないことを意味し、このアイテムの値がゼロ以外の場合、このアイテムに対応するメモリブロックがすでに占有されていることを意味します。この値は、継続的に占有されているメモリブロックの数を表します。例は、 10 、次いで本明細書は、エントリに対応する内部メモリブロックを含む、合計が割り当てられた 10個 の外部にメモリのブロックをポインタ。
図に示すように、メモリ割り当ての方向は上から下です。つまり、一番最後から空のメモリを見つけます。メモリ管理が初期化されると、メモリテーブルがすべてクリアされ、メモリブロックが使用されていないことが示されます。

第三に、分配の原則

ポインタのとき P  呼び出し malloc関数を アプリケーション・メモリは、最初に決定するときに p個の メモリブロックの数から、割り当てられた(M)とする n個の アイテム離れ もしまで見下す始まる mは メモリ管理テーブルに対応する連続した空きメモリブロックのブロック(すなわち、エントリが 0 )、これらの m個の 内の数値メモリ管理テーブルエントリは次のように設定されている M (標識占有)、そして最後に、メモリブロックの最後のアドレスが空のポインタが返される Pを配布を完了すること。十分なメモリがない場合( mの 空きメモリが最後に見つからない場合)、p NULL
 返さ  、割り当てが失敗したことが示されます。

第四に、リリースの原則

とき p個の アプリケーションがメモリ不足時にコールリリースされる 無料の 機能の実装を。 フリー 機能は、最初の決定 、pは 内向き与えるために、対応するメモリブロックのメモリアドレスを、その後、対応するメモリ管理テーブルエントリを見つける のp  によって占有されるメモリブロックの数を m個メモリ管理テーブルの値の数のエントリがメモリブロックが割り当てられます) 、これらの m個の メモリ管理テーブルエントリの値は、リリースマーキング、クリアされているメモリの解放を完了させるために、プットを。 

V.重要なパラメータ

メモリのサイズ=メモリプールのサイズ+メモリ管理テーブルのサイズ

メモリブロック(32バイト)\回  分割ブロック(N)=メモリプール容量(バイト)

(メモリ管理テーブルの占有バイト数(U16:2バイト)  \回 分割ブロック(N))=メモリ管理テーブルの容量(バイト)

一般に、メモリブロックとメモリプールの容量の値は既知であり、ハードウェア容量に基づいてプログラマーが指定します。ここでは、32バイトのメモリブロックと40Kのメモリプール容量を指定します。

 

したがって、分割ブロック(N)=メモリプール容量(バイト)  \ div メモリブロック(32バイト)= 40K \ div 32 = 40  \回 1024  \ div32 = 1280。

メモリ管理テーブルの容量(バイト)= 2 \回 分割ブロック(N)= 2  \回 (メモリプール容量(バイト)  \ div メモリブロック(32バイト))= 2  \回 1280 = 2560。

定义两个内存,一个是内部内存(40K),一个是外部内存SRAM(960K).

内存管理参数:

内存池总大小:40K
内存管理状态表大小:1280 (U16) 数据块个数N
内存分块大小:32 字节


内存池总大小:960K
内存管理状态表大小:30720(U16) 数据块个数N
内存分块大小:32 字节


定义结构体:
struct _m_mallco_dev
{
    u8  *membase[2]; //2个内存池 内部内存和外部内存的内存池
    u16 *memmap[2];  //2个内存管理状态表 
    u8  memrdy[2];      //内存初始化标志
}
定义数组:
内存池:
__align(32) u8 mem1base[40960];  //40K   内存容量(字节) 32个字节一个块,块对齐
__align(32) u8 mem2base[983040] __attribute__((at(0x68000000))); //960K  内存容量(字节)

内存管理状态表:
u16 mem1mapbase[1280];      //内存表大小  40K / 32
u16 mem2mapbase[30720];     //内存表大小  960K / 32


定义的结构体指向定义的数组。
struct _m_mallco_dev mallco_dev=
{
    mem1base,mem1base,
    mem1mapbase,mem1mapbase,
    0,0,
}

 

5、メモリを割り当てるプロセス

1.着信SIZEに従って、いくつかのメモリブロックを割り当てる必要があることを確認します。たとえば、Mブロックが必要です。

2.メモリ内で、連続的に解放されているM個の空きメモリブロックを検索します。連続的な空きブロックがMブロックに対して十分でない場合は、連続したスペースの次の部分が検索されます。連続する空きブロックのMブロックがある場合は、Mブロックのメモリ管理ステータステーブルにMを書き込んで、メモリの連続するMブロックが使用されていることを示します。

6、空きメモリプロセス

1.渡されたオフセットに基づいて、Lに属するアイテムの数を計算し、アイテムLのメモリ管理ステータステーブルの値Rを読み取ります。

2. Lアイテムの後のLメモリ管理状態の値を0に変更します。

105件の元の記事を公開 30のような 16万人以上の訪問者

おすすめ

転載: blog.csdn.net/happygrilclh/article/details/102686173