for
ループで遅延
最初の課題は、delay
関数をペリフェラルを使わずに実装することです。
明らかな解決策は、for
ループで遅延を実装することです。
#![allow(unused)] fn main() { #[inline(never)] fn delay(tim6: &tim6::RegisterBlock, ms: u16) { for _ in 0..1_000 {} } }
もちろん、上の実装は間違っています。どんなms
の値に対しても、常に同じ遅延を生成するからです。
このセクションでは、次のことに取り組む必要があります。
- 入力の
ms
に比例した遅延を生成するように、delay
関数を修正します。 - LEDルーレットが4秒に5回(1周期800ms)程度回るように、
delay
関数を微調整します。 - マイクロコントローラ内のプロセッサは、8MHzのクロックで駆動されており、ほとんどの命令を1「ティック」(1クロックサイクル)で実行します。
1秒の遅延を生成するために、何回の(
for
)ループが、delay
関数に必要だと考えますか? delay(1000)
が実際に実行するfor
ループは何回でしょうか?- プログラムをリリースモードでコンパイルし、実行すると、何が起こりますか?