質問: &htim7){ // 1ms以内に終わる処理 B(); return; } } ``` 上記のようになっている場合、htim7の割り込みでB()が呼び出されたとします。 この場合、B()実行中はhtim6の割り込みが発生せず、結果的にA()は100μs、B()は1ms毎に正確に呼び出されることは無いように思います。 そもそも、この認識が間違っているのでしょうか。 また、仮に上記の認識通りだとした場合、A()、B()それぞれ正確な間隔で呼び出されるようにするにはどのように実装するべきでしょうか。
回答: 1msec タイマ割り込みハンドラに「 1msec 以内に終わる」ような処理を書いたらメイン側の処理可能時間が無くなってしまって論外でしょう。 1msec ハンドラには 0.1msec 以内に終わる処理くらいしか実装してはいけません。(メイン処理というものが存在せず、割り込み内ですべて処理するという書き方もないわけではないですが、処理内容を増やそうとすると時間管理が大変です) 100usec タイマハンドラ内部処理時間も 1msec タイマハンドラ内部処理時間も 10usec 以内に完了するよう修正できるなら 100usec * 10 回 = 1msec ですから `htim7` は削除、すると `htim6` のみ残るので事前判定は不要となり ``` 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回で呼ばれる } } ``` `A()` や `B()` の処理時間によってはあなたの期待通りにならないかもしれませんが、それは割り込み内部で行う処理が多すぎる設計不良です。