Iは、(特にSTM32L151)、皮質-M3コントローラに以下の疑似コードを実装しようとしてい実行中の割り込みハンドラの優先レベルを変更しますか?すなわち
void SysTick_Handler() {
do_high_priority_periodic_tasks(); // not to be interrupted
lower_interrupt_priority();
do_low_priority_periodic_tasks(); // these may be interrupted
}
、優先順位レベル0の最初の部分を実行し、その後、何とか現在の割り込み優先度を下げます他のハードウェア割り込みによって残りの部分がプリエンプトされる可能性があります。
do_low_priority_periodic_tasks();
を別の割り込みハンドラに移動し、このハンドラをNVIC_SetPendingIRQ()
で呼び出すと、NVIC->ISPR[]
レジスタにペンディングビットが設定されます。この方法では、他の割込みは0〜14の間で優先順位の高いものがない限り、ただちにSysTick
に従います。
#define LOWPRIO_IRQn 55
void IRQ55_Handler() {
do_low_priority_periodic_tasks(); // these may be interrupted
}
void SysTick_Handler() {
do_high_priority_periodic_tasks(); // not to be interrupted
NVIC_SetPendingIRQ(LOWPRIO_IRQ);
}
void main() {
HAL_Init();
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_SetPriority(LOWPRIO_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(LOWPRIO_IRQn);
while(1) {
/* main loop */
}
}
私はそれが私のコントローラ上で占められていないので、それはSTM32L162上のAES割り込みハンドラだろうIRQ 55を選んだが、私はそこに少し心配です。代わりに、別のIRQ、おそらく未使用のDMAチャネル割り込みを選択する必要がありますか? Cortex-M3コアで定義されているが、STM32Lシリーズでは定義されていない割り込み57-67を使用するのは安全ですか?それを行うためのより良い方法はありますか?
これはまさに私が探しているものです。ありがとうございます – berendi
あなたは非常によく優先順位を変更することができます。 'PendSVは通常、RTOSでは使用され、ユーザ割り込みハンドラでは使用されませんが、複数のハンドラでは使用できません。これは、実装されていない割り込みを使用することとはまったく関係ありません。 – Olaf