組み込みC/C++

C/C++リテラシー向上のためのページ

古のコード①

一般的な開発というのは古くからの流用ソースを使いますのでレガシーコードの中に古の仕様を見ることが良くあります。

 

far と near 修飾子

これらの修飾子は16bitから32bitへの移行期に見られたマイコン独自に持つ修飾子です。概ねnear は2byte, farは4byteでアドレスを確保します。メモリ空間がどういったものになっているかによりますが例えば

0x000000 ~ 0x0FFFFF のようなメモリ空間があってどこのセグメントもRAMとして使える場合 では nearは0x000000 ~ 0x00FFFFまで、farは0x000000 ~ 0x0FFFFF までメモリを使用できます。

全部farでもよさそうなものですが、なんでこんなものがあるかと言うとfarで宣言した場合、プログラム上のコードが4byte確保されてしまうからです。DefaultではRAMをnear属性にしておいて基本的にプログラム上では2byteしか確保しないようにしています。省メモリが死活問題であるマイコンでは出来るだけROMを少なくするためにこういった仕様が出来ました。

 

基本的に省メモリのための仕様であって高速化というわけではなさそうです。省メモリの仕様と言えば相対アドレッシングというのもあります。相対アドレッシング指定した変数の呼び出し命令(SBレジスタを使用したアクセス)は任意に切った相対アドレッシング用のセクションの先頭アドレスをオフセットとして持ち、差分を保持することでメモリへのアクセスをします。そうすることでアセンブラにした際にRAMにはアドレスの差分だけ保持すればよくなります。しかしその領域は小さいのでよく使う(プログラム上で登場回数の多い)変数にだけ相対アドレッシングモードを割り当てます。

 

資源がないって大変なんです。32bitマイコンではこれらは関係ないのでこのあたりのレガシーコードはさっさと捨てて見通しを良くしましょう。