Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン34(bss,text,dataセクションについて)

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.関連記事

関連記事一覧:
 
組み込みC言語