「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで

セサミアン3人組

tag: 組み込み

技術解説 2003年5月14日

 また,フレーム・ポインタの値をfact(1)のベース・アドレスからfact(2)のベース・アドレスに切り替えたとたんに,fact(1)のベース・アドレスの情報は存在しなくなります(図1-4).つまり,fact(1)の変数部はアクセス不能になり,実質的にそのメモリ領域は解放されたこと(再利用可能)になります.

 ここでは,ランタイム構造の基本的なしくみだけを説明しましたが,実際にはローカル変数も変数部に入れます.また,fact(1)が完了した時点で,fact(2)の計算を引き続き実行するために,関数factのコードのどの部分に戻るかという情報を変数部に入れる場合もあります.具体的な実装はコンパイラに依存します.プログラムの開発に際してはこれらのことを確認したうえでコンパイラを使用することをお勧めします.

 組み込み機器で使用する多くのマイコンでは,メモリ保護機能が十分ではありません.そのため,スタック上の変数部がどんどんふくらみ,スタックと指定した領域を超えても,見かけ上は何も起こりません.「実機の動作がおかしいなあ」とつぶやき,デバッグを行って初めて,スタックがふくれあがってほかの領域を壊していることがわかるのです.これからきっと何度も経験することと思います.「またスタック・オーバフローか」と.これは,WindowsやLinux/UNIX上では味わえない楽しみ(?!)の一つです.

 なお,ここでは再帰呼び出しを例に説明しましたが,通常,組み込みソフトウェアでは再帰呼び出しを使いません.再帰呼び出しを使うと,何度も再帰的に呼び出されることでスタックをたくさん消費するし,スタック・オーバフローを引き起こすことも多いからです.

f01_04.gif
〔図1-4〕fact(2)計算中のスタックとフレーム・ポインタ
フレーム・ポインタにfact(2)のベース・アドレスを格納すると,fact(1)計算のための変数部の領域にアクセスするためのリンク情報がなくなる.つまり,実質的にその領域は解放されたことになる.

●格言:挙動不審なプログラムの裏にスタックあり

 プログラムのランタイム構造は,プログラムをデバッグするうえで理解しておくべき基本です.デバッグ時に,どう考えても理解できない動きを示す場合,ランタイム構造が破壊されていたり,あらかじめスタックとして確保した領域を超えてほかの部分のデータを壊していたりすることがよくあります.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日