割り込みを使うとハングアップしてしまう場合がある

平成21年4月9日

    割り込みサービスルーチンの中で複雑なことをしようとすると、ハングアップしてしまうことがあります。

    具体的にはポインタや配列を使うと、ほぼ確実に誤動作するようです。

    この問題は、トラ技BIOSが、ユーザ定義割り込み処理ルーチンを呼び出す際に、DEレジスタを保存していないため起こると思われます。

    (DEレジスタは関数の呼び出し側が保存しなければならないが、やっていないため)

    この問題を回避するには、割り込み処理ルーチンの先頭と最後で、push de と pop deのコードを埋め込んでください。具体的には次のようにします。

    void intsrv_tim(void) {

        __asm("push de ");

     

        unsigned char delta;

        delta = (dac_in & 0x3f);

        if(sigma >= 0x40) delta |= 0xc0;

        sigma += delta;

        if(sigma >= 0x40) P1.3 = 1;

        else              P1.3 = 0;

        if(sigma >= 0x40) P1.4 = 1;

        else              P1.4 = 0;

        ・・・・・

        ・・・・・

        ・・・・・

        ・・・・・

        // タイマー割り込みフラグをクリア

        IF0H.6 = 0;

        

        if(count++ == 0x10){

            count = 0;

            dac_in = sintable[dac_pos];

            dac_pos += freq;

        }

     

        __asm("pop de ");

    }

     

    これで暴走することはなくなると思います。

 

chickens_back.gif 戻る

 Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず