公式アカウントをフォロー+スターを付けて、楽しいコンテンツをお見逃しなく
著者 | Xingmo
アレンジメント | StrongHuang
何人かの友人がシングルチップメモリの話題を議論しているのを見て、今日は STM32 と併せて共通の分割領域について説明します。
STM32のプログラムコードでは、メモリの上位アドレスから下位アドレスに向かって、スタック領域、ヒープ領域、グローバル領域(静的領域)、定数領域、コード領域が順に配置されています。グローバル領域の上位アドレスは .data セグメントで配布されます。
全体的な分布は次のようになります。
メモリの上位アドレス |
スタック領域 |
ヒープ領域 |
|
.bss セクション |
|
.dataセクション |
|
一定面積 |
|
メモリの下位アドレス |
コードエリア |
1. スタックエリア(スタック)
一時的に作成されたローカル変数はスタック領域に格納されます。
関数が呼び出されると、そのエントリパラメータがスタック領域に格納されます。
関数がリターンすると、戻り値はスタック領域に格納されます。
constで定義したローカル変数はスタック領域に格納されます。
2. ヒープ
ヒープ領域は、プログラムの実行中に動的に分散されるメモリ セグメントを格納するために使用され、増加または減少できます。
malloc などの関数を使用して、メモリを動的に分散できます。
malloc 関数によって割り当てられたメモリは free で解放する必要があります。解放しないとメモリ リークが発生します。
3. グローバルエリア(スタティックエリア)
グローバル領域は、読み取りおよび書き込み可能な .bss セグメントと .data セグメントで構成されます。
4. .bss セクション
初期化されていないグローバル変数は .bss セクションに保存されます。
0 に初期化されたグローバル変数と 0 に初期化された静的変数は、.bss セクションに格納されます。
.bss セグメントは実行可能ファイルのスペースを占有せず、その内容はオペレーティング システムによって初期化されます。
5. .data セクション
初期化されたグローバル変数は .data セグメントに保存されます。
静的変数は .data セグメントに保存されます。
.data セグメントは実行可能ファイルのスペースを占め、その内容はプログラムによって初期化されます。
const で定義されたグローバル変数は .rodata セクションに格納されます。
6. 定面積
文字列は定数領域に格納されます。
定数領域の内容は変更できません。
7. コードエリア
プログラムの実行コードはコード領域に格納されます。
文字列定数もコード領域に格納できます。
上記の説明では、各データの保存場所についてまだ漠然としているかもしれませんが、簡単なプログラムを使用して体験して理解してみましょう。
上記の紹介では、各データの保存場所がまだ曖昧かもしれませんが、簡単なプログラムを体験して理解しましょう [番外編]
#include <stdio.h>
static unsigned int val1 = 1; //val1存放在.data段
unsigned int val2 = 1; //初始化的全局变量存放在.data段
unsigned int val3 ; //未初始化的全局变量存放在.bss段
const unsigned int val4 = 1; //val4存放在.rodata(只读数据段)
unsigned char Demo(unsigned int num) //num 存放在栈区
{
char var = "123456"; //var存放在栈区,"123456"存放在常量区
unsigned int num1 = 1 ; //num1存放在栈区
static unsigned int num2 = 0; //num2存放在.data段
const unsigned int num3 = 7; //num3存放在栈区
void *p;
p = malloc(8); //p存放在堆区
free(p);
return 1;
}
void main()
{
unsigned int num = 0 ;
num = Demo(num); //Demo()函数的返回值存放在栈区。
}
上記では、ヒープ、スタック、グローバル領域、定数領域、およびコード領域の包括的な分析を実行し、例も示しました。以下では、これらの領域がどのメディアに保存されているかについて説明します。
8. RAM、ROM、フラッシュメモリの物理的特性
まず、RAM、ROM、フラッシュ メモリの物理的特性を理解する必要があります。
9、RAM
RAM はランダム アクセス メモリとしても知られており、格納されたコンテンツにはランダムな読み取りおよび書き込み命令によってアクセスできます。RAM に保存したデータは電源を切ると失われるため、電源を入れたときのみデータを保存できます。このうち、RAMは2種類に分けられ、1つはダイナミックRAM(DRAM)、もう1つはスタティックRAM(SRAM、スタティック ランダム アクセス メモリ)です。
10、ROM
ROM は読み取り専用メモリとも呼ばれ、データの読み取りのみが可能であり、データを任意に書き込むことはできません。RAM と比較すると、ROM は読み書き速度が遅いという欠点があります。ただし、電源が落ちてもデータが変わらないという利点があるため、一度書き込んだプログラムやデータの保存によく使われます(例:BIOSプログラムの本体チップはROMメモリです)。
11、フラッシュメモリ
ROMは書き換えが難しいという性質があるため、その後フラッシュメモリが開発されました。フラッシュメモリはROMの電源を切ってもデータが失われず、必要に応じてデータを変更できるという特徴がありますが、価格はROMに比べて高価です。
12. 各種データの保存場所
前回の解析から、コード領域と定数領域の内容は変更が禁止されており、ROM(STM32はフラッシュメモリ)も変更が禁止されていることが分かりました。定数領域はコンパイルされて ROM に格納されます。
スタック、ヒープ、グローバル領域 (.bss セグメント、.data セグメント) はすべて RAM に格納されます。
ここまで、さまざまなデータが格納される領域について完全に紹介しました。以下では Keil の Build Output ウィンドウについても紹介します。
13. Keil のビルド出力ウィンドウ
上に示したように、Code、RO-data、RW-data、ZI-data の 4 つのコード セグメント サイズがあります。
このうち、Code はコード占有サイズ、RO-data は読み取り専用定数、RW-data は初期化された読み取りおよび書き込み可能な変数、ZI-data は初期化されていない読み取りおよび書き込み可能な変数です。
場合によっては、RAM と ROM の使用量を知る必要がある場合は、次の式を使用して計算できます。
RAM = RW データ + ZI データ
ROM = コード + RO データ + RW データ
この記事は元々、著者「Xingmo」によって公開および承認されたものです。ソースアドレスは次のとおりです。
https://blog.csdn.net/lin_duo/article/details/103019390
------------ 終了 ------------
公式アカウントに注意し、ルールに従って技術交流グループに参加するには「 Jiagroup 」と返信し、さらに多くのコンテンツを表示するには「 1024」と返信します。
さらに共有を確認するには、「元のテキストを読む」をクリックしてください。