はじめに
タイムアウト処理とは指定時間を経過しても処理が終わらない場合に、処理を強制終了させることです。
よく使うシーンとしてはUARTやSPIなどの受信待ちです。
例えば1秒間受信待ちをしてもデータが受け取れなかった場合は、諦めて他の処理をしたり、受信できなかった場合の処理に移ったりするようにします。
フリーランカウンタを使ったタイムアウト実装方法を、STマイコン(STM32CubeHAL)の場合を例に上げて紹介します。
やりかた
STマイコンをSTM32CubeHALで使う場合、HAL_GetTick()を使うと1msに調整してくれているので楽です。
何らかの理由でHAL_GetTick()が使えない場合は、タイマーを使って1ms毎に割り込みをかけてカウンタ値をインクリメントするようにして、その値を取得するようにすればOK。
func(uint32_t timeout) { // タイムアウト開始時間取得 uint32_t start_time_ms = HAL_GetTick(); while(1) { // タイムアウトさせたい処理 // TODO : // タイムアウトの確認 if(timeout > 0 && ((uint32_t)(HAL_GetTick() - start_time_ms) > timeout) { break; } } }
0 件のコメント:
コメントを投稿