SDカード・トランスポータの作成(その19)

その18でロジアナでCPLDへのアクセスタイミングを見ているが、L-ch, R-chの設定の開始から完了まで 4.1usかかっている。CPLDからは 22.67us(44.1kHz)間隔で設定タイミングを知らせてくるので余裕は 18.5us位となる。現状、この状態でも処理が回っているようにみえるが、頻繁に起こる割り込み内の処理は極力短くしたいものである。

そこで、割り込み内の処理のコンパイル済みのアセンブリ言語に変換した内容を(初めて)見てみた。そうすると、チョッと驚きの事実に直面した。……というか、よくよく考えれば当たり前である。

8bitマイコンでかつ、汎用レジスタ(r1~r32)が8bitのATmegaシリーズでは16bitのアドレス空間を表すのに2つの汎用レジスタを使用しているので、+1したアドレスを指すコードを記載するとどうしてもアドレスの下位8bitと上位8bitの足し算が入る。割り込み内の処理は read_buff[][] の内容を読み込んでポートへ出力する事を4回行っている。つまり、殆どの処理でアドレスを+1する工程が入り、設定の開始から終了まで 4.1usもかかっているのだ。これは想定外で、当初の見積もりでは割り込み処理全体で 20サイクルくらいの処理になって 20MHz動作で 1us、多くても 2us位かな~と安直に考えていた。それが、ポートへ設定する処理だけで 4.1usもかかっている。割り込み処理全体ではこの2~3倍かかっている事が考えられるのである。

別に、今の割り込み処理時間でソフト全体の処理が回っていれば問題ない。しかし、何かシックリこないのでこの部分の高速化を行おうと思う。高速化の方法はズバリ、割り込み処理をアセンブリ言語で書くということである。やはりC言語では限界がある。

割り込み内の処理では read_buff[][] の4byte分へアクセスするので、この変数自体を4byteアライメントされた空間へ配置、もしくはそれ相当の位置へ配置すれば read_buff[][] からのデータ読み込み時にアドレスの上位へ複数回足し算を行う必要がなくなる。これで少々高速化できそうだ。

これに対して、現時点での問題は以下の3点である。


1. どうやって read_buff[][] を4byteアライメント空間へ配置するか。
2. アセンブリ言語で記述する方法は?
3. そもそも、avr-ar のアセンブリ言語を書いたことがない。


色々とハードルが高そうだが、AVRをもっとよく知る良い機会なのでゆっくりでもいいので1つずつ乗り越えていこうと思う。


スポンサーサイト

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD buildroot DAC FON2405E FM3ペリフェラル BeagleBoneBlack ODROID-U2 mingw FM3評価ボード library OpenGL FM4 bitbake KiCad 計測 プリアンプ Edison VMware 6P43P ミニワッター 6N6P シングル TL-WR700N 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter