リンカ

PC上でのプログラミングではあまりリンカを意識することはありません。なぜなら、すべてのプログラムはHDD/SSDに保存され、実行時にはすべてRAM上に置かれるからです。組み込みソフトウェアの開発ではリンカの存在がとても大事です。

リンカとは何か?

Linkerです。リンクするもの。C言語で記述したソースコードがファイル単位でオブジェクトコードになり、複数のオブジェクトファイルとライブラリをくっつけてひとつの実行ファイルにする、というのがリンカです。組み込みソフトウェアではもうひとつ大事なことがあります。何をメモリの何番地に置くのか?これを決定するのがリンカです。

メモリの番地

組み込みソフトウェアでは、SRAM, DRAM, 内蔵Flash, 外付けXiP Flash, eMMCなどなどさまざまなメモリを扱います。メモリを理解する上で重要なポイントはこの2つです。

  • Instructionをそこから直接実行できるかどうか
  • 可変値を置くことができるかどうか

そして、メモリのどの番地にどの種類のメモリが割り当てられるかはあらかじめ決まっています。番地によってメモリの種類が決まっているんです。

メモリの希少価値

細かい話をするとややこしくなるので、内蔵Flashと内蔵SRAMしかないMCUを例にします。だいたい、Flashのほうが多いんです。Flash 1MB, SRAM 256KBみたいな感じです。SRAMのほうが何倍も希少価値が高いです。Flashはバイト単位で消せませんから、固定値しか置けませんが、固定値は必ずFlashを使う、という意識が重要です。C言語であればInstructionは自然とFlashに置かれますが、変数はそうではありません。int i; とやるとこれはRAMを消費します。固定値であればかならず const int i; としましょう。

リンカの設定

結局のところ、あまり意識することはないかもしれませんが、C言語ではなく違うところから書き換えを行いたい設定値を保存する、のような場合は、設定値の構造体を特定の番地に保存したくなります。こういう場合にリンカの設定が重要になります。

他には、使っているMCUを変更する場合、メモリのサイズが変わる場合にはリンカの設定を見直す必要があります。メモリに関わることはリンカなのです。

コメント