(toppers-users 3436) ASP RX依存部の問題点

Meika Sugimoto asuka.choronos @ gmail.com
2011年 4月 26日 (火) 21:48:33 JST


ASP RX依存部担当者様

お世話になっております.
杉本です.

今,Interace誌付属のRX62N基板にASPを
移植しています.ポーティングの際に気付いた
点を挙げますので,ご対応いただけないでしょうか.

(1)セクション指定の不足

サンプルのワークスペースにてセクションのアドレス指定を
行っていますが,W,W_1,W_2のセクション指定がありません.
最適化をスピード優先にするとこのセクションにデータが
配置されるために,リンクエラーが発生します.
ちなみにこのセクションは分岐テーブルが置かれる場所で,
具体的にはswitch文の速度向上のために生成されるようです.

(2)rx_uart_initの引数名

宣言と実装で引数名が異なります.

(3)EXCNO_VALIDの値

有効なCPU例外の値として31が定義されていますが,リセット例外で
あり,スタートアップルーチンのアドレスが固定で置かれるため,
EXCNO_VALIDに含めるべきではありません.

(4)x_probe_intの返り値

レジスタの値をそのまま返しておりコメントも記されていますが,
bool_tに明示的にキャストする方がよいと思います(コードチェッカでの
警告が出る可能性は潰しておくべき).

(5)コメントのtypo

rx610.hの810行目のコメントでrx600/rx610_uart.cとありますが,
rx600_uart.cが正しいです.

(6)i_begin_intでの割込み要因クリア

i_begin_intで割込み要因のクリアができたか確認していますが,
単に読みだしただけでは問題があります.ループしてチェックする
処理が正しいと思います.

あと,レベル割込みのクリア処理は割込みを発生させた
外部デバイスに先にクリア処理を行う必要があると思うのですが,
i_end_intで行わなくてもよいのでしょうか?
(あまりレベル割込みを使ったことがないので自信はないです)

(7)SMRレジスタアクセス時の時間経過待ち

rx600_uart_setmodeで1bit経過時間を待っていますが,変数iに
volatile指定がないため,最適化で除去される可能性があります.

また,ループ回数が16回固定ですが,100MHzで動作するCPUが
この程度待っても1usecも経過しません.もっと大きい値にする
必要があるのではないでしょうか.
#9600bpsなら約1msecは待たなければいけません

しかもICLKもPCLKも何MHzになるか分からないので,ターゲット
依存部で定義する方が望ましいと思います.


以降は確実に間違っていると言い切れないので疑問として挙げます.

(8)シリアルの受信割込み

rx600_uart_rx_isrが怪しい感がします.
シリアルの受信フラグがないとありますが,SSRレジスタの
RDRFフラグで受信したかは分かります.
仮にないとして,「受信割込みの発生を信じる」という
コメントは適切な表記が好ましいと思います.

(9)データセクションのアドレス

Cセクションなどの固定データをデータフラッシュに配置していますが,
本来ここはアプリケーションが不揮発データを保存するための
領域である感がします.P領域と同じ場所でよいのではないのでしょうか.

最後に,機能上問題はないものの改善したい点です.

(10)レジスタアクセスのアドレス算出方法

割込みコントローラ,シリアルコントローラへのアクセスで
レジスタアドレステーブルを使用していますが,これらは
先頭アドレスとオフセット値で参照可能です.
32bit必要な直接のアドレス参照からオフセット参照(8bitあればよい)に
変更すると.1/4のメモリ容量になります.

現在の実装ではアドレステーブルだけで1KByteを越えているので,
ざっと750byte程度の節約になりそうです.

長文失礼しました.

以上,よろしくお願いします.
-- 
--------------------------
Meika Sugimoto
mail:asuka.choronos @ gmail.com