71032


STMicroの評価用ボードSTM32F207ZGを用いてプログラムを作成しています。  
100μsタイマー、1msタイマーを設定し、タイマー割り込み関数void
HAL_TIM_PeriodElapsedCallback内でそれぞれ処理を行うとします。

[code]

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
        // htim6 -> 100us
        // htim7 -> 1ms
    
        if(htim == &htim6){
            // 100us以内に終わる処理
            A();
            return;
        }
        if(htim == &htim7){
            // 1ms以内に終わる処理
            B();
            return;
        }
    }
    
[/code]

上記のようになっている場合、htim7の割り込みでB()が呼び出されたとします。  
この場合、B()実行中はhtim6の割り込みが発生せず、結果的にA()は100μs、B()は1ms毎に正確に呼び出されることは無いように思います。  
そもそも、この認識が間違っているのでしょうか。

また、仮に上記の認識通りだとした場合、A()、B()それぞれ正確な間隔で呼び出されるようにするにはどのように実装するべきでしょうか。


CC BY-SA 4.0
2020-10-09T00:06:59.130
71030
2020-10-09T01:19:18.447
38100
question
c++ c
STM32 タイマー割り込み関数内での関数呼び出し


1msec タイマ割り込みハンドラに「 1msec 以内に終わる」ような処理を書いたらメイン側の処理可能時間が無くなってしまって論外でしょう。 1msec
ハンドラには 0.1msec
以内に終わる処理くらいしか実装してはいけません。（メイン処理というものが存在せず、割り込み内ですべて処理するという書き方もないわけではないですが、処理内容を増やそうとすると時間管理が大変です）

100usec タイマハンドラ内部処理時間も 1msec タイマハンドラ内部処理時間も 10usec 以内に完了するよう修正できるなら 100usec *
10 回 = 1msec ですから `htim7` は削除、すると `htim6` のみ残るので事前判定は不要となり

[code]

    void HAL_TIM_PeriodElaspedCallback(TIM_HandleTypeDef* htim) {
        static int counter_1msec;
        A(); // 100usec*1 回で呼ばれる
        ++counter_1msec;
        if (counter_1msec>=10) {
            counter_1msec=0;
            B(); // 100usec*10回で呼ばれる
        }
    }
    
[/code]

`A()` や `B()` の処理時間によってはあなたの期待通りにならないかもしれませんが、それは割り込み内部で行う処理が多すぎる設計不良です。


CC BY-SA 4.0
2020-10-09T01:19:18.447
71032
2020-10-09T01:19:18.447
8589
71030
answer