2010年 春期 応用情報技術者試験 問7
タクシーの料金メータの設計
S社は,タクシーの料金メータ(以下,タクシーメータという)を開発している。S社では,ソフトウェアの品質向上を図るために,設計後のレビューを強化することにした。実施したレビューにおいて,タクシーメータのソフトウェアに不具合が見つかった。
【ソフトウェア構成】
タクシーメータは,リアルタイムOS(以下,RTOSという)を使用している。RTOS上では,表示タスク,料金計算タスク,操作パネルタスク,走行距離通知タスク及びRTOSのタイマタスクが動作する。これらのタスク実行中は,特に指定がない限り,すべての割込みが許可されている。
タクシーメータは,タイマ割込み及び操作パネル割込みを使用している。これらの割込みは,タイマ割込みハンドラ及び操作パネルハンドラで処理される。各ハンドラは,それぞれタイマタスク及び操作パネルタスクを起動する。
タクシーメータのタスク一覧を表に示す。
タスク | 処理内容 | 優先度 |
---|---|---|
表示タスク | 料金などをLCDに表示する。 | 低 |
料金計算タスク | 走行距離と走行時間に応じた料金を計算する。 | 中 |
操作パネルタスク | 操作パネルハンドラで起動される。操作パネルからの指示を受け取り,各タスクに通知する。 | 高 |
走行距離通知タスク | 所定距離を走行したことを通知する。 ・料金計算タスクから"走行通知要求"を受け,指定された距離を走行したら,イベントフラグをセットする。 ・"走行通要求"を受けた後,イベントフラグをセットするまでの間に取消し要求を受けた場合は,"走行通知要求"を取り消し,イベントフラグをセットしない。 ・既にイベントフラグをセットした要求に対する取消し要求があった場合,この取消し要求を無視する。 | 高 |
タイマタスク | タイマ割込みハンドラで起動される。このタスクは,RTOSに対する要求のうち,時間に関する処理を行う。 | 高 |
【RTOSの仕様(一部)】
(1) タスクは,優先度によって実行が決定される。優先度は変更することができる。
(2) タスク同期制御にイベントフラグを使用する。イベントフラグの操作にはセット及びクリアがある。
(3) タスクはイベントフラグのセット待ち要求を行うと,イベントフラグがセットされるまで待ち状態となる。既にイベントフラグがセットされている場合は,セット待ち要求を行っても,待ち状態にはならない。
セット待ち要求では,タイムアウトの設定ができる。タイムアウトになると,指定時間内にイベントフラグがセットされなくても,待ち状態が解除される。
(4) タスクごとに,特定又はすべての割込みに対して,割込み禁止及び割込み許可を指定できる。
【タクシーメータの仕様】
操作パネルで"貸走"を指定すると,最初に"L₀メートル走行するまで"又は"T₀秒経過するまで"料金はP₀円である。これを初乗りという。
初乗りの条件を満たすと,"L₁メートル走行する"又は"T₁秒経過する"ことに,料金がP₁円ずつ加算される。L₀,T₀,P₀,L₁,T₁,及びP₁は特別な装置によって設定可能である。
料金の計算は,操作パネルで"支払い"ボタンが押されるまで続けられる。
【料金計算タスク】
料金計算タスクの処理の流れを図に示す。料金計算タスクは,初乗りから"支払い"ボタンが押されるまでの間,図の②~⑦の処理を続ける。
① 表示金額をP₀とし,変数L,Tを初期化する。→ 表示金額 ← P₀
L ← L₀
T ← T₀
② L メートル走行するとイベントフラグをセットするよう,走行距離通知タスクに要求する(走行通知要求)。
③ T秒でタイムアウトするよう,イベントフラグのセット待ちを要求し,イベントフラグのセット待ちとする。
④ イベントフラグをクリアする。
⑤ ②で要求した"走行通知要求"を取り消す。
⑥ 表示金額にP₁加算し,表示金額を更新する。初回に限り変数L,Tを更新する。→ 表示金額 ← 表示金額+P₁
変数L,Tは更新後
L ← L₁,T ← T₁となる。
⑦ 操作パネル割込みを禁止する。表示タスクに通知する(表示タスク通知処理)。操作パネル割込みを許可する。
【不具合の指摘】
レビューを実施したところ,次の二つの指摘があった。
(1) イベントフラグのセット待ち方法の不具合とその対策
料金計算タスクにおいて,イベントフラグのセット待ちを要求しても,待ち状態にならないことがある。その結果,表示金額の計算が過大となってしまう。
この不具合は,aの直後に,bが起きると発生する。
aによってcが解除され,料金計算タスクは実行状態となり,イベントフラグをdする。この直後にbがあると,イベントフラグがセットされてしまい,次のイベントフラグのセット待ちで待ち状態にならない。
この不具合は,図中のeと⑤を入れ替えることで回避できる。
(2) 操作パネル割込み制御の不具合とその対策
図中の処理⑦では,表示タスク通知処理の開始から終了までの間,操作パネル割込みは禁止されているので,操作パネル割込みは実行されないはずである。しかし,次のような場合に,操作パネル割込みを実行してしまう。
操作パネル割込みを禁止した直後にfが発生すると,fハンドラによってgが起動され,料金計算タスクは処理が中断される。
起動されたタスクは,操作パネル割込みを許可しているので,hが発生すると受け付けてしまう。
現在の処理を大きく変更せずにこの不具合を回避するには,表示タスク通知処理実行中は,タスクの優先度をタイマタスクの優先度と同じにするか,又は表示タスク通知処理を行う間は,すべての割込みを禁止すればよい。