2016-11-22 5 views
5

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を使用するのは安全ですか?それを行うためのより良い方法はありますか?

答えて

4

Cortex-M3コアで定義されているがSTM32Lシリーズでは定義されていない割り込み57-67を使用することは安全ですか?

いいえ、あなたのNVICは実際にそれらを実装していないかもしれません。

しかしPendSVは、まさにこのタスクのために構成されています

void SysTick_Handler() { 
    do_high_priority_periodic_tasks(); // not to be interrupted 
    // Set the PENDSVSET to trigger a PendSV exception 
    SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; 
} 

void PendSV_Handler() { 
    do_low_priority_periodic_tasks(); // these may be interrupted 
} 

はPendSVについても、このanswerを参照してください。

+0

これはまさに私が探しているものです。ありがとうございます – berendi

+0

あなたは非常によく優先順位を変更することができます。 'PendSVは通常、RTOSでは使用され、ユーザ割り込みハンドラでは使用されませんが、複数のハンドラでは使用できません。これは、実装されていない割り込みを使用することとはまったく関係ありません。 – Olaf

関連する問題