このようにデータ空間がプログラム空間と別にアクセスできることがわかりましたが、これは絶対アドレスで強制的に参照しただけであって、変数などが外部SRAMのデータ空間から参照されたわけではありません。(smallモデルでコンパイルされているので)
プログラムとデータが分離されたハーバードアーキテクチャモデルでの動作を確認するためlargeモデルでプログラムとデータのロケーションを両方とも同じ8000番地からの指定でコンパイルしてみます
sdcc -mmcs51 --model-large --code-loc 0x8000 --xram-loc 0x8000 test.c
生成されたマップファイルを見ると、先ずプログラム領域:
続いてデータ領域:
とたしかに両方とも0x8000番地から配置されています。
ただし、このプログラムを実行するとき要注意なのはアプリケーションの中でバンクを切り替えても既に遅いということです。Cのスタートアップルーチンの中でデータ空間にある静的変数の初期化とかしているのでバンク切り替え前にアプリを実行すると同じバンク0にあるプログラムを自分自身で破壊してしまいます