割込み 256

割込み

タイマー割込み

タイマーがらみの機能には、経過時間を知る(割込みではない)ための Timer 、指定時間経過後に一度割込みがかかる Timeout 、繰り返し割込みがかかる Ticker がある。

LPC1768は TIMER3 を使用している。

よくあるタイマー割込みは Ticker で実現する。

タイマー割込み

Ticker ticker;

void int_timer () {
    // タイマー割込み
      :
}

int main () {
      :
  ticker.attach(&int_timer, 0.01); // 0.01秒ごとの割込みをセット
      :
}

ピン変化割込み

ピン変化を検出するには InterruptIn を使う。

自動的に入力ポートに設定される。

ピン変化割込み

InterruptIn int_p0(p0);

void int_rise () {
    // 立上り変化割込み時の処理 (Low -> High)
      :
}

void int_fall () {
    // 立下り変化割込み時の処理 (High -> Low)
      :
}

int main () {
      :
    int_p0.rise(&int_rise); // 立上り割込みハンドラをセット
      :
    int_p0.fall(&int_fall); // 立下り割込みハンドラをセット
      :
}

割込みの禁止・許可

    __disable_irq(); // 禁止

    __enable_irq(); // 許可

割込みの優先順位

割込みの優先順位は NVIC_SetPriority() で変更できる。

例えば、標準の状態では同じ優先順位にあるため、割込み処理中に他の割込みがかかることがないため、長い割込み処理をしている場合、他の処理は待たされてしまう。
優先順位をきちんと指定することにより解決できる。

    NVIC_SetPriority(TIMER3_IRQn, 1);

現在の優先順位を得るには NVIC_GetPriority()

優先順位の値は、LPC1768の場合0(高) ~ 31(低)、、LPC11U24の場合0(高) ~ 3(低)。

保留されている割込みのクリア

    NVIC_ClearPendingIRQ(UART3_IRQn);

割込みルーチンアドレスの動的指定

割込みをベクタを上書きする場合

extern "C"
void irq_handler () {
      :
}

      :
    NVIC_SetVector(DMA_IRQn, &irq_handler);

それまで設定されていた割込みベクタを継承する場合

void (*old_handler)(void) = NULL;

extern "C"
void irq_handler () {
      :
    if (old_handler) old_handler();
}

      :
    old_handler = NVIC_GetVector(DMA_IRQn);
    NVIC_SetVector(DMA_IRQn, &irq_handler);

class内関数を呼ぶ割込み

静的メンバ変数を使えば、割込みを活用したclassを作ることができる。

class HOGE {
public:
  static HOGE *hage;

  HOGE () {
    hage = this;
    :
  }

  func () {
    :
  }
};

HOGE *HOGE::_hage;

extern "C"
void XXX_IRQHandler (void) {
  HOGE::hage->func ();
}

致命的エラー 割込み

HardFault

extern "C" void HardFault_Handler() {
    printf("Hard Fault!\n");
    while(1);
}

メモリー確保(new)不能 割込み

set_new_handler

#include "mbed.h"
#include <new>

void no_memory () {
    printf("panic: can't allocate to memory!\r\n");
    exit(-1);
}

int main() {
    set_new_handler(no_memory); // new handler function

    :

Watch Dog Timer

ウォッチドッグタイマー(暴走検出)


戻る (back)


Please log in to post comments.