割込み 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.
