平成24年春期試験午後問題 問7

問7 組込みシステム開発

⇱問題PDF
オーディオプレーヤの組込みソフトウェアの設計に関する次の記述を読んで,設問1~3に答えよ。
 G社では,ハードディスクを内蔵した携帯型のオーディオプレーヤ(以下,プレーヤという)の組込みソフトウェアを開発することになった。
 プレーヤの本体には再生ボタン及び停止ボタンがある。再生ボタンを押すと,あらかじめハードディスクに圧縮して保存しておいた音声ファイルから,音声データを読み出して再生する。停止ボタンを押すと,音声ファイルの再生を停止する。 開発する組込みソフトウェアは,メインタスク,再生処理タスク,データ読出しタスク及びDSP(Digital Signal Processor)ドライバから成る。タスク間の通信にはメッセージを使用する。プレーヤの構成を図1に示す。
 開発する組込みソフトウェアでは,再生中に音声が途切れるのを防ぐために,バッファメモリを使用する。音声ファイルを再生する際には,データ読出しタスクが音声データをバッファメモリに書き込む。再生処理タスクは,書き込まれた音声データを順次読み出し,DSPドライバに転送する。DSPドライバは圧縮されている音声データをDSPに供給して伸張する。伸張された音声データはスピーカーに出力される。
pm07_1.png
〔バッファメモリの制御〕
 バッファメモリの領域は,0~n-1のn個に等分割し,その一つ一つをメモリブロックとして取り扱う。バッファメモリへの書込み及び,DSPドライバへの転送は,メモリブロック単位で行う。
 バッファメモリの制御の様子を図2に示す。pは,再生処理タスクが次に読み出してDSPドライバに転送するメモリブロックの番号である。pからm個のメモリブロックは使用中,それ以外のメモリブロックは未使用である。
 データ読出しタスクの書込みと再生処理タスクの読出しのいずれも,メモリブロックの番号が 0 のメモリブロックから順に使用する。データ読出しタスクの書込み先のメモリブロックの番号が n-1 に達したら,次はメモリブロックの番号が 0 のメモリブロックを使用する。また,再生処理タスクが読み出すメモリブロックの番号も,n-1 に達したら,次はメモリブロックの番号が 0 のメモリブロックを使用する。
pm07_2.png
〔ハードディスクの制御〕
 電力消費を抑えるために,ハードディスクは読出し処理で必要なときだけディスクを回転させ,読出しが終わったら回転を停止させる。ハードディスクの制御に用いる関数を表1に示す。
pm07_3.png
〔DSPドライバの制御〕
 DSPドライバは,DSPを駆動する他,状況に応じて再生処理タスクにメッセージを送信する。DSPドライバの制御に用いる関数を表2に示す。
pm07_4.png
〔組込みソフトウェアのタスク構成〕
 開発する組込みソフトウェアのタスクの動作内容を表3に示す。各タスクには実行状態,待ち状態及び停止状態があり,実行権はラウンドロビン方式で与えられる。
pm07_5.png
 再生処理タスクの流れ図を図3に,データ読出しタスクの流れ図を図4に,図3及び図4で使用しているサブルーチン Buffering(s,t) の流れ図を図5に示す。
 なお,図3中の下線①の判定条件は,音声データの追加読出しを開始する条件である。また,図4中の mod は剰余の演算子で,a mod bはaをbで割った余りである。
pm07_6.png

設問1

表3中のabに入れる適切な字句を答えよ。

解答例・解答の要点

a:再生処理
b:STOPメッセージ

解説

本体の停止ボタンが押され、音声ファイルの再生を停止するときの動作を考えます。

表3「タスクの動作内容」の再生処理タスクの説明には、「STOPメッセージが受信されていると、DSPドライバにDSPの動作停止を指示して、再生処理を終了する」という記述があります。この記述と、図1「プレーヤの構成」にてメインタスクから再生処理タスクへのメッセージの動線があることから、音声ファイルの再生を停止するときには、再生処理タスクにSTOPメッセージを送信すれば良いことがわかります。

よって、[a]には「再生処理」、[b]には「STOPメッセージ」が当てはまります。

a=再生処理
 b=STOPメッセージ

設問2

次にDSPドライバに転送するメモリブロックの番号が p,使用中のメモリブロック数がm個のとき,図4中のdeに入れる適切な式を答えよ。

解答例・解答の要点

d:p+m
e:n-m

解説

[d]はBuffering関数の第一引数の一部、[e]はBuffering関数の第二引数です。そして、Buffering関数のBuffering関数の第一引数と第二引数は、HDDRead関数の第一引数と第二引数としてそのまま使用されています。

表1「ハードディスクの制御に用いる関数」のHDDRead(s, t)の説明には、「ハードディスクから読み出した音声データを、s番目のメモリブロックからt個のメモリブロックにわたって格納して、実際に書き込んだメモリブロック数を返す」という説明があり、第一引数 s は読み込むメモリブロックの開始番号で、第二引数 t は格納するメモリブロックの個数であることがわかります。Buffering関数は、「全ての未使用のメモリブロックを使って,ハードディスクから音声データを読み出す」ために、データ読出しタスクから呼び出されるサブルーチンですから、引数sには未使用領域の先頭ブロックの番号、引数tには未使用のメモリブロックの個数を指定することになります。

図2「バッファメモリの制御」の図解を見ると、音声データの書込みを開始するメモリブロックの番号は p+m、未使用のメモリブロックの個数は n-m 個で表せることがわかります。開始位置の算出で「mod n」としているのは、メモリブロックはn-1番目に達したら次は番号0というように、0~n-1を周回するというリングバッファ(循環バッファ)方式であり、p+m がn-1以下とは限らないからです。例えば、n=100のときに p+m が110だったらp~99および0~10までが使用中ということなので、0に戻って番号11を開始番号にしなければなりません。このための調整です。

d=p+m
 e=n-m

設問3

図3中のcの処理がない場合,ボタンの操作のタイミングによっては,ハードディスクの回転が長時間停止しなくなってしまうことがある。cに入れる適切な字句を,20字以内で答えよ。

解答例・解答の要点

c:データ読出しタスクの終了を待つ (15文字)

解説

表3中のデータ読出しタスクの説明には「再生処理タスクが停止すると、このタスクも同時に強制的に終了させられる」とあります。データ読出しタスクでは、ハードディスクの回転開始、音声データ読出し、ハードディスクの回転停止までの一連の動作を行いますが、音声データ読出し中にタスクが強制終了してしまうと、ハードディスクに回転停止を指示するStandBy()が呼び出されず、ハードディスクが回転したままになってしまうという問題があります。

これを防ぐには、停止ボタンを押したときにデータ読出しタスクが実行中であれば、データ読出しタスクの終了を待って、再生処理タスクを終了する必要があります。図3の流れ図には「メッセージを待つ」という処理がありますから、これに倣って[c]には「データ読出しタスクの終了を待つ」という処理を入れるべきと判断できます。

∴データ読出しタスクの終了を待つ
模範解答

Pagetop