CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

アプリケーション実装(1)

プロトコル部分の動作が問題無くなったのでアプリケーション部分を切り離して
別モジュールでリンクしたところ、いきなり動作しなくなってしまいました。
実行させるといきなり暴走するという感じです。
少しずつコードを削って動作していたときの状態に近づけても全くダメ。
思いついてコンパイラが吐き出すリンケージマップを見て驚きました。

プログラムとデータが格納されるRAMは64kbyteしかないのに
プログラムコード部分のTEXT領域が24kbyteは良いとして
スタティック変数がとられるBSS領域が60kbyte近くに膨らんでいて
その後ろから始まるスタック領域が完全にRAMの外まではみ出ていました。
これではcall/retしたとたんに暴走するわけです

スタティック変数はそれほど無いはずなのになんでこんな多いのかと調べてみると、
原因がわかりました。
プロトコル関係の定義をヘッダファイルにして各モジュールでincludeしているのですが
ヘッダファイルの中でTCPソケット構造体の実体を定義してしまったためでした。
この構造体はパケットを丸まる格納するチャネルを6本持つため約2kbyte×6のサイズになっていますが、
各モジュールにヘッダをincludeするたびに同名の構造体が多重定義されてRAMを圧迫していました。
しかもstatic宣言したので各モジュールで独立したものとみなされエラーにもならなかった
みたいです。

これはTCPモジュールの中で1回だけ定義されるように修正して解決しました。

Start Stop Length Name Class
02000H 059F3H 039F4H TEXT CODE
05A00H 0617BH 0077CH _GHOST_DATA CODE
06180H 06180H 00000H FAR_DATA FAR_DATA
06180H 068FBH 0077CH DATA DATA
068FCH 09A15H 0311AH BSS DATA
09A16H 09A16H 00000H ENDBSS DATA
09A20H 0BA1FH 02000H XSTACK DATA
0BA20H 0BA20H 00000H ENDSTK DATA
0BA20H 0BA20H 00000H FAR_BSS FAR_BSS
0BA20H 0BA20H 00000H END_FAR_BSS END_FAR_BSS

現状では実行に必要なメモリサイズ(コード+データ+スタック)は47kbyteくらいです