Avance.Lab

技術紹介

マイコンのレジスタ参照タイミングによるバグの紹介

公開日:2023.09.22 更新日:2023.09.22

tag: 組み込み車載

こんにちはI-Rです。
今回は、組み込み系で使用するマイコンで発生したバグについて紹介します。
マイコンでは各機能を使用するために、該当するレジスタを設定します。
レジスタの設定を行う際には、設定する順番や待機時間を考慮して設計します。
設定する順番や待機時間を考慮しないと、正しくレジスタが設定できなかったり、値の入出力時に、
正しく機能しないことがあります。
今回は、必要な待機処理を入れなかった事によるバグと、その対処方法を紹介します。
使用したマイコンは、RL78/F14です。
使用した機能は、AD変換機能です。
実現したかった機能は、AD変換結果の取得です。

1.バグの概要

発生したバグの概要は、
AD変換値を取得する際に、取得したいチャンネルと異なるチャンネルのAD値が取得されてしまう。
というもので、イメージとしては下記のイメージ図の様になります。

2.AD変換の概要

まず、今回実現したかったAD変換結果の取得について説明します。
AD変換結果取得処理の大まかな流れは、以下の通りです。

  • 1.AD変換を行う入力端子を選択する。
  • 2.選択した入力端子の電圧を取得する。
  • 3.取得した電圧に対してAD変換を行い、格納レジスタに格納する。
  • 4.AD変換結果が格納された格納レジスタの値を読みだす。

3.バグの解析

先程説明したバグは以下の経緯で発見しました。

  • 1.AD変換値を取得するテストを行った際に、取得したAD変換結果の値が想定とは異なる値であった。
  • 2.各チャンネルでのAD変換実行直後のAD変換結果の格納レジスタ(ADCRHレジスタ)の値を確認した。
  • 3.各チャンネルでの実行結果の値について照合した結果、取得したいチャンネルと
     異なるチャンネルのAD変換値が格納されている事を発見した。

バグ発生時のAD変換処理を再確認した所、以下の通りでした。

  • 1.AD変換の分解能と入力チャネルの設定。
  • 2.AD変換動作の制御ビット(ADCSビット)にAD変換開始を設定。
  • 3.AD変換動作の制御ビットがAD変換終了状態まで待機。
  • 4.AD変換結果格納レジスタ(ADCRHレジスタ)から値を取得。

1~4の処理で設定した設定値や、処理の順番に特に問題はありませんでした。
マイコンマニュアルを確認した結果、2と3の処理の間に必要な処理が抜けている事が判明しました。
AD変換動作の制御ビットは、AD変換開始を設定しても、変換起動時間が経過するまでは
AD変換終了状態となっています。
そのため、2でAD変換開始設定後、すぐに3でAD変換動作の制御ビット確認しても
AD変換終了状態のままとなっており、 3での待機処理がAD変換未完了時でも、
完了と判断されてしまいます。
これにより、AD変換完了前にAD変換結果格納レジスタを読み出してしまい、
目的のAD値を取得できていない事が原因でした。

4.バグの対処方法

上記の原因を踏まえてAD変換開始設定直後に、変換起動時間分の待機処理を追加する事としました。
AD変換起動時間は、今回のケースではfCLK/8でした。
fCLK(CPU/周辺ハードウェア・クロック周波数)を元に計算すると、
7クロック分待機する必要があります。
具体的には下図の通りです。

上記の対処により、AD変換が完了した後にAD変換結果格納レジスタの値を取得できるようになり、 取得したいチャンネルの値を正しく取得できるようになりました。

5.後書き

今回作成したAD変換のレジスタの設定値自体は、正しかったのですが、
必要な待機処理を入れなかった事により、処理が正しく行われず、バグが発生しました。
作成時には各レジスタの設定値や仕様についてまとめたページをよく確認していました。
一方で、別の章のページに記載されていた機能全体に関わる仕様や、 細かい注意事項については
確認が不十分であったと思います。
今回の件を踏まえて、マイコンマニュアルの各機能の章の構成を把握し、
全体の仕様を見落とさない様に注意するようにしております。
今回はテスト工程の段階で発見できたため、大事には至りませんでした。
このバグが納品後に判明した場合は、会社の信用に関わる重大な問題となる所でした。
バグは一度発生させてしまうと、該当部分のソースコードの修正だけでなく、 各種設計書の修正や、
類似箇所の調査、お客様との会議といった様々な 追加作業が発生してしまいます。
それにより、大きな負荷が発生し、後戻りの工数が増えてしまいます。
今回紹介した内容を参考に、今この記事をご覧になっている方が バグの発生を
未然に防ぐ事の一助になりましたら、幸いです。

I-R
I-R

仕事と趣味で研究の日々。
仕事でも趣味でも自分が培ったノウハウを可能な限り周りに広めたい。

関連記事