0

最初のコード:

//------------------------------------------------------------------------------
/// Interrupt handlers for TC interrupts. Toggles the state of LEDs
//------------------------------------------------------------------------------
char token = 0;
void TC0_IrqHandler(void) {
    volatile unsigned int dummy;
    dummy = AT91C_BASE_TC0->TC_SR;  
    if(token == 1) {
        PIO_Clear(&leds[0]);
        PIO_Set(&leds[1]);
        token = 0;
        }
    else {
        PIO_Set(&leds[0]);
        PIO_Clear(&leds[1]);
        token = 1;
        }
    }
//------------------------------------------------------------------------------
/// Configure Timer Counter 0 to generate an interrupt every 250ms.
//------------------------------------------------------------------------------
void ConfigureTc(void) {
    unsigned int div;
    unsigned int tcclks;
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;       // Enable peripheral clock
    TC_FindMckDivisor(1, BOARD_MCK, &div, &tcclks);     // Configure TC for a 4Hz frequency and trigger on RC compare
    TC_Configure(AT91C_BASE_TC0, tcclks | AT91C_TC_CPCTRG);
    AT91C_BASE_TC0->TC_RC = (BOARD_MCK / div) / 1;      // timerFreq / desiredFreq
    IRQ_ConfigureIT(AT91C_ID_TC0, 0, TC0_IrqHandler);   // Configure and enable interrupt on RC compare
    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
    IRQ_EnableIT(AT91C_ID_TC0);
    printf(" -- timer has started \n\r");
    TC_Start(AT91C_BASE_TC0);
    }

それは単なる割り込みタイマーであり、イベント(ハンドラー)ですが、いくつか実行すると

while(1) {
  // action

ConfigureTc()サイクルと割り込みタイマーの両方がフリーズした後...それはなぜですか?別のタイマーを追加して回避する必要がありwhile(1)ますか?

while(1) {
  printf("hello");
  }

-- これはループを壊します (フリーズします) (はい、タイマーを使用しない場合は、必要に応じて機能します)

4

1 に答える 1

1

ここで実際の答えを出します。IME、私のボードは 99% の確率で、どの入力にも応答せず、優先度の低い「点滅」スレッドからの「ハートビート」LED フラッシュもなく、CPU はプリフェッチまたはデータ アボート ハンドラに飛び出しました。これらのハンドラーは割り込みによって開始され、ほとんどのライブラリ定義のデフォルト ハンドラーは割り込みを再度有効にしないため、システム全体に負荷がかかります。多くの場合、それらは単なる無限ループであり、割り込みを無効にすると、話は終わりです:(

デフォルトのハンドラーを変更して、適切な「CRITICAL ERROR」メッセージを UART に出力するようにしました (ポーリングにより - OS/割り込みがうまくいきません!)。

于 2012-09-13T20:17:32.353 に答える