コメント
Unknown
(
Chuck
)
2009-07-26 07:10:32
以前に私もこの問題につき当たった事があります。
テーブルをアセンブリ言語で書いて、Cからはテーブル先頭アドレスを extern const の uint_farptr_t としてアクセスしました。
そのときはBYTE読み出ししただけでしたが、構造体だとちょっと面倒かもしれませんね。
Unknown
(
nekosan
)
2009-07-26 21:05:52
Chuckさん、ありがとうございます。
uint_farptr_t って指定の仕方があるんですね…。
1案としてインラインアセンブラで.db展開しておいて、そこにポインタで変数のガラを重ねて参照し様かとか考えていたんですが、重ねる変数の定義自体が仕様制約に引っかかっちゃうので、それじゃぁ元の木阿弥だな…と思って諦めてました。
早速イロイロ調べてみました。
http://www.nongnu.org/avr-libc/user-manual/group__avr__inttypes.html#g5082b177b7d7b2039652c26a72b96d18
こことか
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=34344&highlight=GET_FAR_ADDRESS
こことかでいろいろ触れられてました。
akibowさんのところで日本語訳もあるようです。感謝。
構造体にするのはちょっと難しいかも…。
でもまぁ、今回の件に限定したら、1バイト単位バラバラで読むんでも事足りるので、応用可能ですね。
Unknown
(
Chuck
)
2009-07-27 07:16:10
GET_FAR_ADDRESS までたどり着きましたね。avr-gcc に公式に取り込んでもらいたいもののひとつです。
構造にしたがって pgm_read_byte_far() を繰り返し呼んで手元の構造体にコピーしてアクセスすればいいのではないでしょうか?
もっともread onlyの使い方だと思うのでそこまで頑張らなくても良いのかもしれません。
Unknown
(
nekosan
)
2009-07-27 23:47:17
マイコンで巨大な配列定義を行うようなケースって、おおよそ「音声などのシリアルアクセスのバイナリデータ」や「デコード用の定数テーブル定義」とかに限られると思うので、いっそのこと用途限定の専用関数やマクロが組み込まれちゃうと楽でいいよなぁ…なんて思いました。
ハーバードアーキティクチャだから、無理に通常のC言語変数とシームレスなアクセス方法を踏襲させようとすると無理が出るし、8ピンのマイコンと多ピンのマイコンで同じ内部定義を流用すればやっぱり無理が出るだろうし…
コメントを投稿する
名前
タイトル
URL
コメント
※絵文字はjavascriptが有効な環境でのみご利用いただけます。
▼ 絵文字を表示
携帯絵文字
リスト1
リスト2
リスト3
リスト4
リスト5
ユーザー作品
▲ 閉じる
コメント利用規約
に同意の上コメント投稿を行ってください。
コメント利用規約に同意する
数字4桁を入力し、投稿ボタンを押してください。
テーブルをアセンブリ言語で書いて、Cからはテーブル先頭アドレスを extern const の uint_farptr_t としてアクセスしました。
そのときはBYTE読み出ししただけでしたが、構造体だとちょっと面倒かもしれませんね。
uint_farptr_t って指定の仕方があるんですね…。
1案としてインラインアセンブラで.db展開しておいて、そこにポインタで変数のガラを重ねて参照し様かとか考えていたんですが、重ねる変数の定義自体が仕様制約に引っかかっちゃうので、それじゃぁ元の木阿弥だな…と思って諦めてました。
早速イロイロ調べてみました。
http://www.nongnu.org/avr-libc/user-manual/group__avr__inttypes.html#g5082b177b7d7b2039652c26a72b96d18
こことか
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=34344&highlight=GET_FAR_ADDRESS
こことかでいろいろ触れられてました。
akibowさんのところで日本語訳もあるようです。感謝。
構造体にするのはちょっと難しいかも…。
でもまぁ、今回の件に限定したら、1バイト単位バラバラで読むんでも事足りるので、応用可能ですね。
構造にしたがって pgm_read_byte_far() を繰り返し呼んで手元の構造体にコピーしてアクセスすればいいのではないでしょうか?
もっともread onlyの使い方だと思うのでそこまで頑張らなくても良いのかもしれません。
ハーバードアーキティクチャだから、無理に通常のC言語変数とシームレスなアクセス方法を踏襲させようとすると無理が出るし、8ピンのマイコンと多ピンのマイコンで同じ内部定義を流用すればやっぱり無理が出るだろうし…