}という簡単なコードだが、iをいくら増やしても変わりがない。コンパイラーの最適化を疑ったが、i--は立派な処理だ。無効になるわけがない。それにこの関数は、前から使っていたはずだ。念のため、コマンドを新設してこいつの待ち時間をSysTickの時間で測ってみた。うひゃー、全部0で帰ってくる。コンパイラーがこのステップを取ってしまっているに違いない。volatile("NOP");を入れる(これはアセンブラーコードでなくマクロだそうだ。従ってARMでも共通)。待ち時間遅れが作れた。コンパイラーの仕業だ。雑誌で動いていたのは開発環境IARとGNUの違いだろう。して無駄なコードなのだ。理解に苦しむが文句を言っても始まらない。ところが、待ち時間を作ってもうまく行くときと行かないときがある。時間待ちはあくまでも対症療法だ。基本から確実な方法を探すしかない。いちどソースコードをひとつひとつ追いかけて手順を考えることにした。BeagleBoardのセットアップ(次記事で紹介)で少し日をあけたのが良かったのだろう。良い方法を思いついた。これまで送信関数の方ばかりに注目して、何とかしようとあれこれ考えていた。割込みルーチン側で動作モードを設定していけばうまく行くことに気がついた。送信関数は、いつどこで割込みを受けるかわからないのでデータカウントが変わる可能性がある。バッファーを制御するスイッチにもうひとつ「データなし」というステイタスを追加してプログラムを組み直した。祈る気持ちでテストする。前と変わりなくデータが送信できた。CPUのオーバーヘッドが明らかに減っている。その証拠に先のループで待つウェイトルーチンの時間が早くなったのだ。