STM32(bss,text,dataセクション)
1.本日の内容
(1) セクション及び、そのセクションの内容について理解する。
使用マイコン:
・目次
2.内容
(1) セクションとは
・プログラムはメモリに配置されて実行される。
・メモリ上にはプログラム内の「機械語」や「変数」「定数」など、
各種用途ごとに分かれて配置される。
・その単位のことをセクションという。
メモリについては下記を参照
→STM32マイコン33(CubeIDEの使い方:空きメモリ容量の確認)
(2) セクションの種類と意味
※基本的なセクションの種類と意味
(a) bssセクション(block started by symbol):
→static修飾された変数(静的変数)やグローバル変数の中で、
初期化されてない変数や、
0で初期化された変数が配置される。
(初期値を持たない静的変数など)
※static修飾子については下記記事を参照
(b) dataセクション:
→初期化された静的変数やグローバル変数を格納する領域
→明示的に初期化された値を持つ。
→プログラムがロードされるときにメモリに読み込まれ、
実行中に変更される可能性がある。
(c) textセクション:
→プログラム(コード)の保存領域
→プログラムの命令や関数のバイトコードが含まれる。
→通常、読み取り専用のメモリ領域であり、実行時に変更されることはない。
(d) heapセクション:
→動的に割り当てられるメモリ領域
→プログラム実行中にmalloc関数などを使用して、メモリの割り当てを行う。
→ここに割り当てられた場合、明示的な解放命令(free関数など)がない限り、
プログラム終了まで、メモリを保持する。
(e) stackセクション:
→関数呼び出しやローカル変数など、
プログラムの実行中に自動的に割り当てられるメモリ領域。
→プログラムが関数を呼び出すたびにスタックフレームが作成され、
関数のパラメータやローカル変数がスタックに格納される。
関数が終了すると、スタックフレームが解放され、メモリは再利用可能となる。
※スタックフレーム:
関数が呼び出された時、その関数の実行に必要な情報を保持する為に
スタックメモリ上に割り当てられる領域。
関数のローカル変数、戻りアドレス、関数呼び出し時に保存される一時的な情報を格納する。
これ以外にも、リードオンリーデータセクション、コンスタントデータセクションなど、様々なセクションが存在する。
参考:STM32CubeIDEでメモリーの使用状況を確認する - moon's STM32づくし
(3) セクションをプログラムで確認
#include <stdio.h> int bss_sec1; // bssセクションに配置 int data_sec1 = 10; // dataセクションに配置 int main(void){ static int bss_sec2; // bssセクションに配置 static int data_sec2 = 20; // dataセクションに配置 int stack_sec1; // stackセクションに配置 char *set; set = (char*)malloc(100); // heapセクションに配置 }
プログラム:https://paiza.io/projects/l0SArvdE5IpuuImyDAmWBA
CubeIDEなどの場合、これらの容量がビルド時に確認できる。
これによって、ビルド時のそれぞれの容量が確認できる。
空きメモリの確認方法については下記参照
→STM32マイコン33(CubeIDEの使い方:空きメモリ容量の確認)
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary