動作不良を起こすことがある、とお客様から問い合わせがあって、ちょっと見てくれない?
製品発売から2年経ち、他の製品の開発を進めていたある日のこと。
恐ろしい内容の電話とともに、バグを抱えたまま製品リリースしてしまっていた話をします。
動画でも喋っています。
バグには種類がある
バグには重欠点、軽欠点と言われるように程度の違いがあり、それぞれの欠点はさらに細分化されます。
重欠点だと人体に危険を及ぼすとか、製品仕様を満足しない、とか。
軽欠点だとボタン操作が効かないとか、設定内容が次回起動時に反映されていないとか。
このうち全品回収になるのは、重欠点です。私がやらかしたのは、そう…重欠点です…。
不具合内容
製品には外部の入力信号を検出して、処理した結果に応じた内容をLCDに表示するプログラムを実装していました。
このLCD表示が実際と違うのではないか、という問合せがありました。
LCD に結果が表示されるのが特徴の製品だったので、今回の連絡が本当なら製品仕様を満足しないため全品回収の重欠点です。
製品は複数の入力ピンをもち、そのうちの一つがローからハイになったタイミングで、他の入力ピンの信号レベルを検出する割り込み処理が入る仕組みです。
この処理がうまくいってないということになります。
発売前には何度も評価を実施して入念に確認してきた部分だったため、動作不良が起こるわけないだろうと思いました。
「またまた御冗談を!笑」
と、この時点では思ってました
動作確認と解決方法
何十回も電源の入り切りしたり、入力信号を変えたりした結果、 確かに動作不良を起こすことを確認できました。
この時点で重欠点バグ確定です…やってしまった…。
やばい…これはやばい…
全く笑えない状況です
ただこの動作不良には再現性がなかったので、どうやって確かめて良いのか苦労しました。
その後何度もデバッグしながらソースコードを確認したところ、 入力信号からは入らないであろう分岐に処理が飛んでいることがわかりました。
ということは割り込み処理が入る入力ピンのレジスタ設定がおかしいのだろうということになり、ソースコードを確認したところ、 入力ピンの設定をしていませんでした。
というか設定する必要がないとその時点では考えていたのです。なぜなら設定しない場合は0だと思い込んでいたから。
しかしマイコンのデータシートを参照すると、ほとんどのレジスタは初期設定で0がセットされるのですが、今回の設定部分に関しては初期値が不定だったのです。
そこで設定を0にすると明示したところ、動作不良は起こらなくなりました。
これは全部署に頭下げに行くの決定です
レジスタが不定ってどういうこと
レジスタと言っても内部はハイorローの電気信号なので設定しない限り0になりそうですが、不定になるとはどういうことかマイコンメーカーに問い合わせました。
すると、電源投入直後の外気温や電源電圧レベルによってどちらになるか分からないピンは不定と表現されるとのこと。
対処
直ちにファームウェアの更新、 有識者とソースコードレビューをし、全ての機能が問題なく動作することも試験して確認、全営業員向けの説明文書の作成、製造ラインの生産停止、とやることはたくさんあります。
すでに購入して使用しているお客様のファームウェアを更新したいのですが難しいのです。
とはいえ営業の皆さまおよびホームページにてお客様に対して製品回収の案内を出し、適宜ファームを更新することでしのぐことができました。
そして本件は会社内の勉強会で報告事案となり、今後このようなことが起こらないよう開発中のチェックリストに「レジスタの初期値を確認し、不定の場合は初期値を設定すること」の文言が追加されました。
同僚たちからはブーブー言われました…。
ほんとすみません…
金銭的な損失も大きい
例えば、1台のバグ対応に10分かかるとします。
その製品はすでに10,000台出荷されていたとすると、バグ対応に100,000分=1,666時間かかります。
1人の人件費が2,000円/時間としたら、1666 * 2000 = 3,332,000。
約300万円の純損失を生み出したのと同じです。
お金だけでなく製品や会社に対する信用にも関わるので、できる限り避けなくてはならない。それが重欠点バグです。
こういう事情があって、組み込みエンジニアの仕事は品質要求が高いのです。
まとめ
マイコンのレジスタ設定を怠り、動作不良を招いた
レジスタ不定となるのは、外気温や電源電圧レベルに影響を受けるため
マイコンが動き出したらちゃんとレジスタ設定しましょう
コメント