連載
» 2010年03月26日 00時00分 公開

イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (2/3)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,@IT MONOist]

コンパイラとリンカの働きを理解しよう

――健一君、いくつかのプログラムを経験して、gccのコマンド操作にすっかり慣れたようです。ここで視点を変えて、実際にgccでどんな処理が行われているのか、コンパイラやリンカの機能に目を向けてみましょう。実は、マイコンのプログラミングでは、開発ソフトウェアを使いこなすための知識が必要なのです。

 まず、Cコンパイラが出力するオブジェクトの構造を理解するために、プログラムがどのようなパートから構成されるかを解説しましょう。


 一般的にプログラムは、「コード(code)」「データ(data)」「スタック(stack)」の3つのパートから構成されます(図5)。

プログラムの要素 図5 プログラムの要素

 コードは、プログラムの処理内容が記述された部分で、CPUの機械語命令をいいます。

 データは、プログラムの処理の対象となるものですが、その内容は少し複雑です。データは大きく、プログラムが実行中に内容を書き換える「可変データ」と、リードのみの「固定データ」に区別できます。さらに、可変データは初期値を持つデータと初期値のないデータに区別できます。

 プログラム自身は、以上のコードとデータから構成されますが、プログラムを実行するためには、「スタック」が必要です。スタックは、C言語の自動変数や引数の記憶域として使用されます。

 Cコンパイラは、コードやデータなどのプログラムのパートを、セクション単位で出力します。図6にgccが出力するオブジェクトファイルの内容(概略)を示します。

オブジェクトファイルの内部形式 図6 オブジェクトファイルの内部形式

 それでは、以下で各セクションについて説明します。

テキストセクション(.text)

 「.text」と名前の付いた「テキストセクション」には、プログラムのコードが格納されています。.textセクションは実行可能属性を持ちます。

 ユーザープログラムによって.textセクションの内容が書き換えられることはありません。マイコンでは、.textセクションをROMに配置します。

データセクション(.data、.rodata)

 「データセクション」には、データが格納されています。データセクションは、その性格によって、「.data」セクションと「.rodata」セクションがあります。

 .dataセクションの内容は、ユーザープログラムによって書き換えが可能です。従って、.dataセクションはROMに配置し、プログラムのスタートアップでRAMにコピーします。

 一方、.rodataセクションの内容は、ユーザープログラムによって書き換えられることはありません。.rodataセクションはROMに配置します。

BSSセクション(.bss)

 「.bss」セクションは、初期値を持たないデータ領域を意味します。「BSSセクション」は、領域のみのセクションです。オブジェクトファイル内で内容を持ちませんが、プログラムの実行時、指定した大きさのRAM領域を確保します。

 ソフトウェア開発で、コンパイルに続く作業が「リンク」です。リンカは、複数のモジュールを結合し、1つの実行可能プログラムを生成しますが、ここではどのような処理が行われているのでしょうか。

 図7のように、リンクはセクションを単位として結合します。リンカは入力されたモジュールの同じ名前のセクションを寄せ集めて、1つのセクションにまとめているのです。

セクションの結合 図7 セクションの結合

 リンカのもう1つの仕事は、プログラムの「再配置(relocation)」です。図8のように、リンカは、その性格に応じてセクションをROMまたはRAMに割り当てます。

セクションのメモリ配置 図8 セクションのメモリ配置

 リードのみのセクションは、ROMに配置します。また、リード/ライトのセクションは、RAMに配置します。

 問題は、.dataセクションのように初期値のあるリード/ライトのセクションです。この場合は、初期データをROMに配置し、変数領域をRAMに配置します。プログラムの実行時はRAM領域をアクセスしますが、実行に先立ちROM上のデータをRAM領域にプログラムで転送します。


photo

なるほど、これからはコンパイラやリンカの働きまで意識しないといけないな〜。


photo

そうね。パソコンなら、プログラムはすべてRAMに配置されるけど、マイコンの場合、ROMとかRAMがあるからね!!


ところで健一君。H8マイコンを使ってパソコンのプログラミングみたいに「printf関数」を使ってみない?


photo

おぉ!


H8マイコンでもprintfが使えるのか!!


photo

違うわよ!


printf関数を自分で作るの!!


photo

ゲゲッ〜。



Copyright © ITmedia, Inc. All Rights Reserved.