[H8-ML(726)] Re: [H8-ML(724)] 割り込み処理失敗談
From: "Henry Sugimoto of O.B." <ob_henry@xxxxxxxxxxxxxxxx>
Date: 2000年07月29日(土)09時57分30秒

村井さん!  面白そうなので、

> 概要
>  IRQ0がLOWとなると、SCI0をクロック同期モードにし、SCI0送信
> データエンプティ割り込み及び、受信データフル割り込みでDMAを
> 起動し、コマンド送信、データ受信を行っています。

>  割り込み処理プログラム先頭でCCR Iビットをクリアーしたため
> 送受信途中で他の割り込みが入り送受信データが化けていたようで
> した。

> 変更方法
>  割り込みプライオリティーレベルをIRQ0,DMA,SCI0を1に設定し、
> SYSCR UE=0にし、割り込みプログラム先頭でCCR UI ビットをクリ
> アーする事により、プライオリティーレベル1の割り込み以外受け
> 付けないようにしました。

1.    問題の、不正動作とは、どのようなものでしたか?  不正動作の
    原因となった、割り込みは(割り込み起動が原因なら)何だったの
    すか?  IRQ0の再割り込みですか?    又は発生した不正な現象
    は DMA の動作不良ですか?
    DMA と、割り込みの 優先度が マニュアルからは読み取れず、
    DMA中に 優先度の高い割り込みが 入った場合 DMA 動作が
    速度低下し、取りこぼしを起こす場合が有ると考えていました。
    今回の事例はこれに該当しますか?      今回のケースでは、通
    信速度が DMA 処理を必要とするくらい 高速だったのでしょうか? 

2.    SCU 利用 私の、通常の組み方ですと 以下の構造で、115200B
       PSまで、対応出来ています。

    SCU 1文字受信、1文字送信、送信終了、エラー回復を割り込みで
              実行。

    CMT 1msec 割り込みで、1ms、10ms、100m1,1S タイマー
               変数のカウントアップ、多重割り込みフラグを立てて、バック
                グラウンド処理起動(処理起動フラグが有効で有れば)

    本文    無限ループで、全体の処理をサービスします。

                ちなみに、SCU は、送受バッファー経由で用い、直接
                本文から、SCU関数を呼び出しません。 送信バッファーが
                空で、送信文字が生じた場合、scu0_sets()、scu0_setb()は、
                送信割り込み許可のみで、実際の送信は全て送信り込みが
                実行してくれます。  リングバッファー利用ですから、DMA
                利用について回るアドレス管理を 隠蔽でき、結構御気楽で
                す。

                unsigned char txb[1280];           // 送信バッファー
                unsigned char rxb[1280];           // 受信バッファー
                int txpp;                    // 送信文字ポインター
                int txpq;                    // 送信済み文字ポインター
                int rxpp;                    // 受信文字ポインター
                int rxpq;                    // 受取済み文字ポインター

                int scu0_set(long int baud,int bits,int stop,int parity);

                int scu0_setb(unsigned char c);
                int scu0_sets(unsigned chasr cs);
                int scu0_writable(void);

                locate(int x,int y);
                printf(var ..);

                unsigned char scu0_getb();
                int scu0_gets(unsigned char *cs,int length);
                int scu0_readable();

                API(Application Program Interface)関数はこんな感じです。

    村井さんの例ですと、CMT 処理で、 IRQ0割り込み処理で、セットされた
    起動フラグをみて、AD受信処理を1msec 毎に、監視し、必要な 操作を
    加える事で実現出来ます。  
    杉本


〒226-0002 横浜市緑区
東本郷 6-17-1-602
オンボード  tel 045-473-7678
        fax 045-474-5351
WEB ---
 http://www02.so-net.ne.jp/~ob_henry



スレッド概略
[724(R)](起点)
 └[表示中]
   ├[728(1)]
   └[730(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]