簡単にソースを説明すると、まず先頭のTicks/startTick/finishTickはベンチマーク時間測定用のGlobal変数である。次のHextable[]はLED表示用のTableだが、全消灯を示す3ffを新たに追加した。次のKeyFlagと2つのDefinitionはキーのOn/Offに絡むものだ。
その下のRec_pointer型の定義〜NUMBER_OF_RUNSの手前まではdhry_1.cの中身をそのままコピーであるが、画面表示などは行わないので必要ないものは抜いている。NUMBER_OF_RUNSは文字通り、Dhrystoneを何回まわすかの定義だ。
LEDR_outは10個のLED列を点灯/消灯するもので、これは前回(http://monoist.atmarkit.co.jp/mn/articles/1608/10/news045_5.html)と全く同じだが、次のHEX_out2桁まとめて表示(00〜99)すると同時に、-1が来たら全消灯するように変更した。別に深い意味はなく、単に見栄えの問題である。
次のAlarm_Intは、Timer_1msで割り込みが入ると立ち上がる割り込みルーティンである。Tickは無条件で1ms毎にカウントアップする変数で、時間測定はこのTickを参照する形にしたが、これとは別にこの中でKEYの値を見るようにした。これによりユーザーの操作がすぐ反映されるようになっている。
さて、dhry()は、元々はdhry_1.cの中にあるmain()であるが、繰り返し数を決めうち&結果の表示を全て取っ払ってすっきりさせた形だ。void型で宣言した通り、特に戻り値などは見ていない。Proc_1()〜Func_3()まではdhry_1.cとdhry_2.cの中身をそのままコピーしており、改変はしていない。
最後がmain()で、まずLED表示の初期化後、alt_alarm_start()を呼び出して1msのタイマーを有効にしている。そのあとはwhile()の中でキー1が押されたらFLAGを1に、キー2が押されたらFLAGを0にし、そしてFLAG=1なら1回(=NUMBER_OF_RUNSで実行した数だけ)dhrystoneを実行して所要時間を表示する(この時間測定のために、dhry()の先頭と最後で、そのその時点のTickの値をstartTickとfinishTickに保存している)。LEDは右端を、Dhrystone実行中の間だけ点灯、2桁の7セグメントLEDはDhrystone実行後にループ100回分の所要時間(ms)を表示している。
Copyright © ITmedia, Inc. All Rights Reserved.