フレッシャーズのための組み込みソフト開発講座 ――新人エンジニアがまわりの信頼を勝ち得るには...
あるとき,最大データ長を2,048バイトにする仕様変更が発生しました.そこで,内部バッファ・サイズだけを2,048バイトにして,リリースしました.ところが,受信データが1~2バイト欠落するというトラブルが発生したのです.
原因は,内部バッファから上位プログラムのバッファへデータを転送する箇所を割り込み禁止にしていたためでした(図4(a)).内部バッファは,割り込みハンドラと通常のタスクによって共有されています.つまり,内部バッファを操作する場合,割り込み禁止が必須でした.割り込み禁止・解除の処理のオーバヘッドを嫌って,かなり長い区間を割り込み禁止にしたのですが,データ・サイズをまったく考慮していませんでした.
例えば1バイトのコピーに1μsかかるとすると,128バイトの転送では128μsの割り込み禁止時間が生じます(これでも十分長いのだが,このときはたまたまほかの問題が発生しなかった).内部バッファのサイズが2,048バイトだと,割り込み禁止時間は2,048μs(=約2ms)にも及びます.これを9,600bpsの伝送速度で通信したとすると,約2バイトのデータを受信する間,割り込み禁止の状態となり,受信割り込みを検出できなかったのです.
結局,割り込み禁止区間を見直して,オーバヘッドの問題をあきらめ,こまごまと割り込み禁止・解除の処理を行うことにしました(図4(b)).当時,仕様変更の依頼が来たとき,「割り込み禁止区間はだいじょうぶか?」と先輩たちに指摘されたのですが,筆者はその重要さや問題を認識できませんでした.
この件を通じて,筆者は「割り込み禁止がシステムに及ぼす影響」や「データ数がプログラム(システム)全体に及ぼす影響」を身を持って感じるようになり,それ以降,割り込み禁止とデータ量の問題には非常に気を配るようになりました.
〔図4〕トラブルが発生したコピー処理
原因は,内部バッファから上位プログラムのバッファへデータを転送する箇所を割り込み禁止にしていたためだった.
tag: 技術教育