0

3 つの割り込みが有効、1 つの UART から IRQ (シリアル ポート)、Timer1 から IRQ (ちらつき LED を制御)、Timer0 から FIQ (出力ステッピング信号の生成)。

最初の FIQ ハンドラは空です:

void FIQ_HANDLER(void) __fiq
{
   if(FIQSTA & TIMER0)
   {
        T0CLR = 0;
        break;
   }
}

IRQ ハンドラ:

void IRQ_HANDLER(void) __irq
{
   if(IRQSTA & TIMER1)
   {
        T1CLR = 0;
        MAKE_LED_FLASH();
        break;
   }
   if(IRQSTA & UART)
   {
        BLAH_BLAH_BLAH();
        break;
   }
}

上記のコードは問題なく動作し、LED の点滅、UART 応答、およびその他の機能も良好です。しかし、FIQ ハンドラーにいくつかのコードを追加した後、主にカウンター (uint16) を設定し、IO を高/低にします。

void FIQ_HANDLER(void) __fiq
    {
       if(FIQSTA & TIMER0)
       {
            if(cts>0)
            {
                IO_BLAH_BLAH_BLAH();
                cts--;
            }
            T0CLR = 0;
            break;
       }
    }

CPU は起動後数秒 (~2 秒) にロックアップし、その後 LED の点滅が停止し、UART が応答しなくなります。変数 cts も最初は 0 に設定されています (したがって、if() は入力できません)。

私は最初に、timer0 の設定が速すぎることが原因であると考えました (そのため、より多くの FIQ が一緒にスタックされ、クリアされることが少なくなります)。そこで、timer0 をあまり頻繁に設定しませんでした。そして..起動時に問題ないようです.LEDは点滅し続けます...しかし、シリアルポート(UART)を介していくつかの文字を送信すると、システムはすぐに再びロックされます. ---! どうしたの?

ここに書かなければならない重要な情報を見逃している場合は、お知らせください。

4

1 に答える 1

1

おそらく、一方のスタックがオーバーフローし、もう一方のスタックが破損しています。FIQ、IRQ、およびその他のスタックを正しく初期化したこと、および各スタックに十分なメモリを予約したことを確認してください。

于 2012-12-29T16:16:03.397 に答える