外部SRAM16ビット単位アクセス

外部SRAMが16ビット単位でのアクセスしかできない
ハードで、外部SRAMをデータ領域として使用すると
挙動がおかしく、データアボートで落ちたり、参照
したデータがおかしく見えたりします。
(コード変更するたびに、状況が異なる)
データ型宣言やコンパイラの設定等で回避できる仕方
がご存じでしたら教えて頂けますか?

環境:
 CPU   :SH7216
 デバッガ :E10-USB
 コンパイラ:High-performance Embedded
       Workshop 4.09.01
 外部SRAM(8MB):CS0に割り当て
OS    :ITRONVer4.0
 標準関数(printfをシリアル入出力
     (デバッグ用))

ちなみに簡易プログラムを作成しデータ領域として
試して見ると、byte型、short型、long型でも
リード、ライトができました。

アクセスする場合はshort型やlong型で定義して
いれば使用できると思っていますが、この認識は
正しいでしょうか?
  • HITさん、エビスクラウンです。

     byte型でもリード、ライトができた? は、ちょっと疑問です。目的の変数が偶数番地、奇数番地のどちらでもOKかを確認してみてください。16ビットバスだと奇数番地はNGだと思います。

     また、short型やlong型ならばOKとの認識もNGです。殆ど場合はOKですが、処理内容によってはNGとなります。例えば、

    short a;
     a/256
     a%256

    等とした場合、最適化によっては上位バイトのみリード、下位バイトのみリードの結果が出る可能性があります。SHの場合、volatile型修飾子を指定することでアクセスサイズが必ず守られるようになります。 従いまして、volatile型修飾子の指定が必要と言うことになります。
  • エビスクラウンさん

    早速の回答ありがとうございます。

    byte型は奇数アドレスでOKですが、
    short型は奇数アドレスがNGで
    long型は4の倍数以外はNGでした。

    volatile型修飾子の指定することは
    コンパイラの最適化を抑止し、明示的に
    偶数アドレスに割り当てれば奇数アドレス
    へのアクセスを回避できると言う意味
    ですね。


    出来たらプログラマが意識せずにコンパイラ
    の設定で出来たらと思いましたが、やはり、
    意識的に奇数アドレスをアクセスしないように
    するしか方法はないのですね。

    了解しました。

  • HITさん、エビスクラウンです。

     それならば「外部変数のvolatile化」のオプションを使ってはどうでしょうか? プログラマが意識しなくても、外部変数は自動的にvolatile宣言されたのと同じ効果が得られます。

     設定は、ビルド⇒SuperH RISC...Standard Toolchain⇒コンパイラのタブ⇒カテゴリは最適化⇒詳細ボタン⇒外部変数のタブにある「外部変数のvolatile化」のチェックボックスです。

     ただし、目的のオプションを設定したソースファイル内の全ての外部変数が最適化抑止となります。つまり、最適化を実施したい外部変数まで最適化抑止の対象となることはご理解ください。
  • エビスクラウンさん

    Volatile化がコンパイルオプションでできるのですね。
    早速試してみます。

    ありがとうございました。