。テキスト
.textセグメントには実際のコードが含まれ、マイクロコントローラーのフラッシュメモリにプログラムされます。フラッシュメモリの連続していないブロックが複数ある場合、複数のテキストセグメントが存在する場合があります。たとえば、メモリの最上部にある開始ベクトルと割り込みベクトル、および0から始まるコード。または、ブートストラップとメインプログラム用の個別のセクション。
.bssおよび.data
関数またはプロシージャの外部に割り当てることができるデータには3つのタイプがあります。1つ目は初期化されていないデータ(歴史的には.bssと呼ばれ、0の初期化データも含まれます)、2つ目は初期化された(非BSS)、または.dataです。「bss」という名前は、歴史的には約60年前にアセンブラーで使用されていた「Block Started by Symbol」に由来しています。これらの領域は両方ともRAMにあります。
プログラムがコンパイルされると、変数はこれら2つの一般領域のいずれかに割り当てられます。リンク段階で、すべてのデータ項目が一緒に収集されます。初期化する必要のあるすべての変数には、初期値を保持するためにプログラムメモリの一部が確保され、main()が呼び出される直前に、変数は通常crt0というモジュールによって初期化されます。bssセクションは、同じスタートアップコードによってすべてゼロに初期化されます。
いくつかのマイクロコントローラーでは、RAMの最初のページ(最初の256の場所、ページ0と呼ばれることもあります)へのアクセスを許可する短い命令があります。これらのプロセッサのコンパイラは、near
そこに配置する変数を指定するなどのキーワードを予約する場合があります。同様に、ポインターレジスタを介して特定の領域のみを参照できる(追加の命令が必要)マイクロコントローラーもあり、そのような変数は指定されていfar
ます。最後に、一部のプロセッサはビット単位でメモリのセクションをアドレス指定でき、コンパイラはそれを指定する方法を持ちます(キーワードなどbit
)。
そのため、これらの変数が収集される.nearbssや.neardataなどの追加のセグメントが存在する場合があります。
.rodata
関数またはプロシージャの外部の3番目のタイプのデータは、初期化された変数に似ていますが、読み取り専用であり、プログラムで変更できないことを除きます。C言語では、これらの変数はconst
キーワードを使用して示されます。それらは通常、プログラムフラッシュメモリの一部として保存されます。時には、.rodata(読み取り専用データ)セグメントの一部として識別されます。ハーバードアーキテクチャを使用するマイクロコントローラでは、コンパイラは特別な命令を使用してこれらの変数にアクセスする必要があります。
スタックとヒープ
スタックとヒープは両方ともRAMに配置されます。プロセッサのアーキテクチャに応じて、スタックが大きくなったり小さくなったりする場合があります。大きくなると、RAMの下部に配置されます。大きくなると、RAMの最後に配置されます。ヒープは、変数に割り当てられていない残りのRAMを使用し、スタックの反対方向に成長します。スタックとヒープの最大サイズは、通常、リンカーパラメーターとして指定できます。
スタックに配置される変数は、キーワードなしで関数またはプロシージャ内で定義された変数ですstatic
。それらはかつて自動変数(auto
キーワード)と呼ばれていましたが、そのキーワードは必要ありません。歴史的には、auto
Cに先行するB言語の一部であり、そこで必要だったために存在します。関数パラメーターもスタックに配置されます。
RAMの一般的なレイアウトを次に示します(特別なページ0セクションがないと仮定)。
EEPROM、ROM、およびNVRAM
フラッシュメモリが登場する前は、プログラムとconstデータ(.textおよび.rodataセグメント)を保存するために、EEPROM(電気的に消去可能なプログラム可能な読み取り専用メモリ)が使用されていました。現在、使用可能なEEPROMはごくわずか(2KBから8KBバイトなど)しかありません。通常は、パワーダウン時の電源投入時に保持する必要がある構成データまたはその他の少量のデータを保存するために使用されます。サイクル。これらはプログラムで変数として宣言されていませんが、代わりにマイクロコントローラーの特殊レジスターを使用して書き込まれます。EEPROMは別のチップに実装し、SPIまたはI²Cバス経由でアクセスすることもできます。
ROMは、工場でプログラムされている(ユーザーがプログラムできない)ことを除いて、基本的にフラッシュと同じです。非常に大容量のデバイスにのみ使用されます。
NVRAM(不揮発性RAM)はEEPROMの代替であり、通常は外部ICとして実装されます。通常のRAMは、バッテリバックアップされている場合、不揮発性と見なされる場合があります。その場合、特別なアクセス方法は必要ありません。
データはフラッシュに保存できますが、フラッシュメモリの消去/プログラムサイクルの数は限られており(1000〜10,000)、そのために実際には設計されていません。また、メモリのブロックを一度に消去する必要があるため、数バイトだけを更新するのは不便です。コードと読み取り専用変数を対象としています。
EEPROMには、消去/プログラムサイクルの制限がはるかに高い(100,000〜1,000,000)ため、この目的にははるかに適しています。マイクロコントローラで使用可能なEEPROMが十分に大きく、不揮発性データを保存する場所です。ただし、書き込み前にブロック単位で消去する必要があります(通常は4KB)。
EEPROMがない場合、または小さすぎる場合は、外部チップが必要です。32KB EEPROM はわずか66¢で、1,000,000回まで消去/ 書き込みが可能です。同数の消去/プログラム操作を備えたNVRAMは、はるかに高価(x10)です。NVRAMは通常、EEPROMよりも読み取りが高速ですが、書き込みが低速です。一度に1バイト、またはブロック単位で書き込まれます。
これらの両方のより良い代替手段は、本質的に無限の書き込みサイクル(100兆)と書き込み遅延のないFRAM(強誘電性RAM)です。NVRAMとほぼ同じ価格で、32KBで約5ドルです。