割込み 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
ウォッチドッグタイマー(暴走検出)
Please log in to post comments.