応用情報技術者 2014年 春期 午後 問07
園芸用自動給水器に関する次の記述を読んで、設問1〜4に答えよ。
G社は、園芸用自動給水器(以下、給水器という)を開発している。
〔給水器の概要〕
給水器は庭に設置し、設定した時刻に庭の植物に霧状の水を噴射(以下、給水という)する。開発中の給水器の構成を、図1に示す。

給水器は、給水ユニット(以下、ユニットという)を最大四つまで接続することができる。ただし、給水に必要な水圧を維持するために、同時に給水できるのは最大2ユニットまでである。給水器の給水設定は、操作パネルで行う。図2に示すように、操作パネルは表示部とキーから構成される。

一つの給水設定では、ユニット番号、予約番号、給水を開始する時刻(以下、給水時刻という)、給水を継続する時間(以下、給水時間という)を入力する(給水時間の単位は分)。予約番号を指定することで、ユニットごとに1日最大4回まで給水することができる。また、給水時間は最大20分まで設定できる。
〔給水器の組込みソフトウェア〕
給水器の組込みソフトウェアには、リアルタイムOSを用いる。タスクには、実行状態、実行可能状態、待ち状態及び休止状態があり、イベントトリブンによるプリエンプティブ方式で状態遷移が行われる。各タスクの動作内容を、表1に示す。

給水器では、同時に給水できるのは2ユニットまでなので、計数型セマフォを用いて次のように排他制御を行う。
・初期化タスクにおいて、セマフォの初期値を c に設定する。
・給水操作タスクにおいて、給水弁を開く操作の前に d を獲得する。獲得できたときは給水弁を閉き、獲得できないときは獲得できるまで待ち状態に移行する。
〔操作パネルのキースキャン動作〕
図3に示すキースキャン回路を用いて、操作パネルのキーを読み取る。この回路は給水器を制御する MCU に接続されており、MCU に内蔵されている 4 個の出力ポートで列を選択し、4 個の入力ポートを読むことによって、16 個のキーの状態を読み取る。

〔機能拡張の検討〕
インターネットを経由して、外出先から給水器の設定を変更したり、状態を監視したりする機能を、給水器に追加することを検討した。この通信はインターネットを経由することから、“通信相手の e を行い、なりすましによる不正な給水器操作を防止する”、“通信内容が漏えいしないように、通信データを f する” などのセキュリティ対策が必要である。
設問1:[給水器の組込みソフトウェア]について、(1)~(3)に答えよ。
(1)表1中のa、bに入れる適切なタスク名を答えよ。
模範解答
a:給水設定
b:給水弁操作
解説
解答の論理構成
-
a に入るタスクの特定
- 【問題文】表1「キースキャン」タスクの説明に
“スキャンした結果、キーが押されたと判断したときは、押されたキーに対応するキーコードを生成し、a タスクに送信する。”
とあります。 - 同じ表1で、キーコードを受信して処理しているのは
“給水設定タスク” の “キースキャンタスクからのキーコードを待ち、キーコードを取得すると表示部に表示する。”
という記述だけです。 - よって、a = “給水設定” が論理的に整合します。
- 【問題文】表1「キースキャン」タスクの説明に
-
b に入るタスクの特定
- 【問題文】表1「給水スケジュール」タスクの説明に
“1分周期で起動し、各ユニットの給水時刻と現在時刻を比較し、一致すれば、給水時間を指定して、b タスクを起動する。”
とあります。 - 給水時刻が来た後、実際に給水弁を開閉するのは
“給水弁操作” タスクで、
“ユニットごとに起動され…①ユニットに設置された給水弁を開いて、給水を開始する。”
と明示されています。 - したがって、b = “給水弁操作” が適切です。
- 【問題文】表1「給水スケジュール」タスクの説明に
以上より、解答は
a:給水設定
b:給水弁操作
a:給水設定
b:給水弁操作
誤りやすいポイント
- “キーコードを送信する先” を “表示部を持つタスクだから表示タスク” と短絡的に判断してしまう。実際には “表示部” を扱うのが “給水設定” タスクである点を見落としがちです。
- “給水スケジュールが起動するタスク” を “給水スケジュール自身” と誤記するミス。タスク起動の主体と対象を区別する必要があります。
- “給水弁操作” と “給水ユニット” を混同し、タスク名ではなくハード構成名を書いてしまうケアレスエラー。
FAQ
Q: タスク名はプログラムソースと一致していなくても採点されますか?
A: 本問はタスク名そのものが空欄になっており、表1に示された正式名称をそのまま記入する必要があります。略称や別名は不正解になります。
A: 本問はタスク名そのものが空欄になっており、表1に示された正式名称をそのまま記入する必要があります。略称や別名は不正解になります。
Q: “給水ユニットごとに起動され” とあるが、同時に起動できるのは本当に 2 タスクまで?
A: 給水弁操作タスクは同時に複数起動できますが、セマフォの初期値を “2” と設定しているため、3 つ目以降はセマフォ獲得待ちになり、実際の給水動作は 2 ユニットまでに制限されます。
A: 給水弁操作タスクは同時に複数起動できますが、セマフォの初期値を “2” と設定しているため、3 つ目以降はセマフォ獲得待ちになり、実際の給水動作は 2 ユニットまでに制限されます。
Q: キースキャンタスクが同じキーの押下を無視するのはなぜですか?
A: 前回送信したキーコードを保持し、今回も同一であれば “押し続けられている” と判断して送信を抑止することで、キーリピートによる多重入力を防止しています。
A: 前回送信したキーコードを保持し、今回も同一であれば “押し続けられている” と判断して送信を抑止することで、キーリピートによる多重入力を防止しています。
関連キーワード: リアルタイムOS, セマフォ, キースキャン, プリエンプティブ, タスク間通信
設問1:[給水器の組込みソフトウェア]について、(1)~(3)に答えよ。
(2)全ての給水設定を記憶するのに必要な、不揮発性メモリのサイズは何バイトか。整数で答えよ。
模範解答
128
解説
解答の論理構成
-
最大ユニット数を把握
【問題文】には「給水ユニット(以下、ユニットという)を最大四つまで接続することができる」とあります。
→ 1 日に設定を持てるユニットは最大で “4 ユニット” です。 -
ユニット当たりの予約数を確認
同じく【問題文】に「ユニットごとに1日最大4回まで給水することができる」と明記されています。
→ 1 ユニットが持つ給水設定は最大 “4 件” です。 -
1 件当たりのメモリサイズを確認
【問題文】のタスク説明で「このとき、一つの給水設定は8バイト構成とする」と規定されています。
→ 1 設定あたり “8 バイト” が必要です。 -
総メモリ量を算出
ユニット数 × 予約数 × 1 件のサイズ
= 4 ユニット × 4 件 × 8 バイト
= 16 件 × 8 バイト
= 128 バイト。
よって、全ての給水設定を記憶するには 128 バイト が必要です。
誤りやすいポイント
- 「同時に給水できるのは最大2ユニット」という制約をメモリ計算に混同する。これは水圧の話であり、設定件数には影響しません。
- “1 日 4 回” を “装置全体で 4 回” と読み違え、総件数を 4 件と誤認してしまう。
- 「一つの給水設定は8バイト構成」を見落とし、項目数から独自にバイト数を再計算してしまう。
FAQ
Q: 同じ予約番号を上書き保存した場合、必要メモリは減りますか?
A: 減りません。設問は「最大件数を全て保持する」前提で計算します。
A: 減りません。設問は「最大件数を全て保持する」前提で計算します。
Q: 不揮発性メモリを使う理由は何ですか?
A: 【問題文】にあるとおり「不意の電源断に備えて」設定を保持し、再起動後もスケジュールを失わないようにするためです。
A: 【問題文】にあるとおり「不意の電源断に備えて」設定を保持し、再起動後もスケジュールを失わないようにするためです。
Q: 同時に 2 ユニットまでという制限があるのに、4 ユニット × 4 件を保存するのは冗長では?
A: 給水の同時実行数と予約保持数は別問題です。将来の時間帯が重ならなければ 16 件全てが有効に利用されます。
A: 給水の同時実行数と予約保持数は別問題です。将来の時間帯が重ならなければ 16 件全てが有効に利用されます。
関連キーワード: 不揮発性メモリ, 設定件数, バイト数計算, 組込みソフトウェア
設問1:[給水器の組込みソフトウェア]について、(1)~(3)に答えよ。
(3)本文中のc、dに入れる適切な字句を答えよ。
模範解答
c:2
d:アクセス権
解説
解答の論理構成
-
まず問題文を確認します。
引用:
“給水器では、同時に給水できるのは2ユニットまで…”
“…計数型セマフォを用いて次のように排他制御を行う。
・初期化タスクにおいて、セマフォの初期値を c に設定する。” -
計数型セマフォは「同時に利用できる資源数」をカウントで表します。資源=“同時に給水できるユニット”は最大“2”なので、セマフォ初期値も“2”に合わせる必要があります。
よって c = 2 となります。 -
次に d を検討します。
引用:
“給水操作タスクにおいて、給水弁を開く操作の前に d を獲得する。” -
セマフォで占有・解放する対象は一般に「アクセス権」または「資源アクセス権」と呼ばれます。タスクはアクセス権を獲得して初めて給水弁(資源)を操作できます。
従って d = アクセス権 となります。 -
以上より解答は
c:2
d:アクセス権 となります。
誤りやすいポイント
- “最大四つまで接続”と“同時に給水できるのは最大2ユニット”を混同し、セマフォ初期値を4にしてしまう。
- d に「セマフォ」「カウント」などを記入してしまう。獲得・解放の対象はセマフォ自体ではなく、その内部で管理される“アクセス権”。
- バイナリセマフォ(0/1)と計数型セマフォ(複数資源)を同一視してしまい、制御方法を誤解する。
FAQ
Q: 計数型セマフォとミューテックスの違いは何ですか?
A: ミューテックスは“1”個の資源を守る排他制御でカウントは0/1、計数型セマフォは“複数”の資源数を表すカウント値を持ちます。本問では同時に2ユニットまで給水できるため計数型セマフォが適しています。
A: ミューテックスは“1”個の資源を守る排他制御でカウントは0/1、計数型セマフォは“複数”の資源数を表すカウント値を持ちます。本問では同時に2ユニットまで給水できるため計数型セマフォが適しています。
Q: アクセス権を獲得できなかったタスクはどうやって再開しますか?
A: “獲得できないときは獲得できるまで待ち状態に移行する”と記載されており、セマフォカウントが解放で増加した時にOSが待ちタスクを実行可能状態へ遷移させます。
A: “獲得できないときは獲得できるまで待ち状態に移行する”と記載されており、セマフォカウントが解放で増加した時にOSが待ちタスクを実行可能状態へ遷移させます。
Q: バイナリセマフォで2台同時給水を実現できますか?
A: できません。バイナリセマフォは1つの資源専用なので、2台同時給水には初期値2の計数型セマフォを使う必要があります。
A: できません。バイナリセマフォは1つの資源専用なので、2台同時給水には初期値2の計数型セマフォを使う必要があります。
関連キーワード: 計数型セマフォ, 排他制御, リアルタイムOS, アクセス権, イベントトリブン
設問2:〔操作パネルのキースキャン動作〕について、(1)、(2)に答えよ。
(1)あるキーを押したときの、P0~P3の出力値に対するP4~P7の入力値を表2に示す。このとき押されたキーを、図2のキー名称で答えよ。


模範解答
6
解説
解答の論理構成
-
キーマトリクスの構成を確認
【問題文】では「列1:ダイオード終端(P0)」「列2:ダイオード終端(P1)」「列3:ダイオード終端(P2)」「列4:ダイオード終端(P3)」、行は「行1(P4)」「行2(P5)」「行3(P6)」「行4(P7)」と示されています。さらに、行2(P5)のキー配列は【図02】に「4 5 6 ユニット」と明記されています。 -
テストパターンの読み取り
表2の 2 行目で「P1=1」のとき「P5=1」になっています。他の行では、出力を “1” にしても入力は全て “0” です。よって、
・“列2(P1)” と “行2(P5)” が導通している
・押されているのは「行2 × 列2」に対応するキー -
行2×列2 が表すキー
行2(P5)のキー一覧は【図02】で「4 5 6 ユニット」と左から順に並んでいます。列2(P1)は左から 2 番目なので、該当キーは「6」です。 -
以上より、押下されているキー名称は「6」と結論付けられます。
誤りやすいポイント
- 列番号・行番号の取り違え
列1=P0 から右方向に番号が振られていることを見落とし、列とピン番号を逆に読んでしまう。 - 入力が “1” になる条件の勘違い
「列を High にして行側が High を検出=その交点のキーが押下」というキースキャンの基本動作を忘れ、どの出力が “1” のときにどの入力が “1” になるかを取り違える。 - ダイオード存在の意味を無視
ダイオードの向きにより電流の流れが一方向である点を無視し、ゴーストキー(偽検出)の有無を誤判断する。
FAQ
Q: 出力を “1” にしても入力が “1” にならない列があるのは正常ですか?
A: はい。該当列に押下キーがなければ、行側はプルダウン抵抗で “0” に固定されるので全て “0” になります。
A: はい。該当列に押下キーがなければ、行側はプルダウン抵抗で “0” に固定されるので全て “0” になります。
Q: 同じ行で複数キーを同時に押すとどう検出されますか?
A: 他列のスキャン時に該当行が “1” になるため、同周期内で複数キーが個別に検出されます。ダイオードがあるのでゴーストキーは発生しにくい構造です。
A: 他列のスキャン時に該当行が “1” になるため、同周期内で複数キーが個別に検出されます。ダイオードがあるのでゴーストキーは発生しにくい構造です。
Q: デバウンス処理はどのタスクで行っていますか?
A: 【問題文】の「キースキャンタスク」に記載の通り「10ミリ秒周期で起動」「前回と同じキーコードの場合は送信しない」でスイッチチャタリングを吸収する実装になっています。
A: 【問題文】の「キースキャンタスク」に記載の通り「10ミリ秒周期で起動」「前回と同じキーコードの場合は送信しない」でスイッチチャタリングを吸収する実装になっています。
関連キーワード: キーマトリクス, センシング回路, プルダウン抵抗, ダイオード, デバウンス
設問2:〔操作パネルのキースキャン動作〕について、(1)、(2)に答えよ。
(2)図3中のダイオードは、出力ポートP0~P3の短絡を防止するためのものである。ダイオードがない場合に、短絡する要因となるキー操作を、15字以内で述べよ。
模範解答
複数のキーを同時に押す。
解説
解答の論理構成
- 【問題文】には「図3中のダイオードは、出力ポートP0~P3の短絡を防止するためのもの」と明示されています。
- キーマトリクス方式では、MCU が列(P0~P3)を順番に Low にし、行(P4~P7)の入力を読み取ります。
- ダイオードがあることで、ある列が Low でも他列へ電流が逆流せず、列同士の電位差が保たれます。
- ダイオードが無い状態で「複数のキー」を同列・同行にまたがって同時に押すと、Low にした列と High の列がキー接点と行ラインを介して直接つながり、出力ポート間でショート(短絡)が発生します。
- したがって、短絡の要因となる操作は「複数のキーを同時に押す」です。
誤りやすいポイント
- 「長時間押し続ける」「チャタリング」など時間的要因を挙げる誤答
- 「同じ列のキーを同時に押す」と限定してしまう誤答
- ダイオードの役割を逆流防止ではなく“電圧降下用”と誤解するケース
FAQ
Q: なぜ 1 つのキーでは短絡しないのですか?
A: 1 つだけ押された場合は、Low に設定した列と行がつながるだけで、他列とは接続されません。電流は MCU の 1 本のポートにしか流れず短絡は起きません。
A: 1 つだけ押された場合は、Low に設定した列と行がつながるだけで、他列とは接続されません。電流は MCU の 1 本のポートにしか流れず短絡は起きません。
Q: MCU の出力をすべてハイインピーダンスにすればダイオードは不要ですか?
A: 列を切り替える瞬間に Low と High が混在するため、完全にハイインピーダンス動作を保証するのは難しく、実装上のリスクが残ります。そのためハードウェア側でダイオードを入れて逆流を確実に防ぎます。
A: 列を切り替える瞬間に Low と High が混在するため、完全にハイインピーダンス動作を保証するのは難しく、実装上のリスクが残ります。そのためハードウェア側でダイオードを入れて逆流を確実に防ぎます。
Q: “複数のキー”とは具体的にどのような組合せですか?
A: 典型例は「行が共通で列が異なる 2 つ以上のキー」を同時押しする状況です。これにより Low 列と High 列が行ライン経由で短絡します。
A: 典型例は「行が共通で列が異なる 2 つ以上のキー」を同時押しする状況です。これにより Low 列と High 列が行ライン経由で短絡します。
関連キーワード: キーマトリクス, ダイオードOR, ゴーストキー, 短絡保護, 入出力ポート
設問3:
給水中に、他の予約番号の給水時刻になり、連続して給水が行われた。そこで給水設定時に、同一ユニットの設定済給水時刻から60分以内の給水時刻を、設定できないようにしたい。この処理はどのタスクに追加するのがよいか。タスク名を答えよ。
模範解答
給水設定
解説
解答の論理構成
- 【問題文】表1の「給水設定」タスクは、
“設定操作の最後に確定キーが押されると、入力された給水設定を給水スケジュールタスクに通知するとともに、不意の電源断に備えて、不揮発性メモリに記憶する。”
とあり、ユーザ入力を受け付けて確定させる唯一のタスクです。 - 今回追加したい機能は「同一ユニットの設定済給水時刻から60分以内の給水時刻を拒否する」という“入力内容のチェック”です。
入力が確定される前に検査し、エラー表示や再入力を促すことが合理的です。 - もし検査を「給水スケジュール」タスクで行うと、
“1分周期で起動”するたびに不要な判定を繰り返すうえ、すでに不揮発性メモリに保存済みの不正データを後追いで修正することになり、処理効率・設計の一貫性が損なわれます。 - 以上より、60分以内チェックを追加すべき場所はユーザ入力を確定する直前の「給水設定」タスクとなります。
誤りやすいポイント
- 「給水スケジュール」タスクに入れたくなる
→ 同タスクは“1分周期で起動”し実行時にユニットを起動する役割。入力バリデーションは責務外です。 - “排他制御”や“セマフォ”と混同する
→ 今回の要件はスケジュール重複防止であり同時給水の排他とは別問題です。 - “60分以内”をユニットを跨って適用する誤解
→ 指定は“同一ユニット”に限定。ユニットごとの重複を見落とさないよう注意します。
FAQ
Q: 60分以内チェックをリアルタイムOSの機能で自動化できますか?
A: いいえ。OSのタイマやセマフォは排他や時刻待ちには便利ですが、“設定済みデータと新規入力の比較”というロジックはアプリケーションタスク(「給水設定」)に実装するのが妥当です。
A: いいえ。OSのタイマやセマフォは排他や時刻待ちには便利ですが、“設定済みデータと新規入力の比較”というロジックはアプリケーションタスク(「給水設定」)に実装するのが妥当です。
Q: 不揮発性メモリへの書込みタイミングは変わりますか?
A: チェック結果が許可の場合のみ“入力された給水設定を…記憶する”という現行フローを維持します。エラーなら書込みを行わず再入力させます。
A: チェック結果が許可の場合のみ“入力された給水設定を…記憶する”という現行フローを維持します。エラーなら書込みを行わず再入力させます。
Q: 既存データの整合性はどう保ちますか?
A: 新規設定時にのみチェックをかければ、過去に不正な重複が存在しない前提で整合性が保たれます。もし既存データ精査が必要なら「初期化」タスクで一括検査を追加する手もあります。
A: 新規設定時にのみチェックをかければ、過去に不正な重複が存在しない前提で整合性が保たれます。もし既存データ精査が必要なら「初期化」タスクで一括検査を追加する手もあります。
関連キーワード: 入力バリデーション, タスク分割, 不揮発性メモリ, イベント駆動, リアルタイムOS
設問4:
〔機能拡張の検討〕について、本文中のe、fに入れる適切な字句を答えよ。
模範解答
e:機器認証
f:暗号化
解説
解答の論理構成
- 本文には、インターネット経由で遠隔操作を追加する際のセキュリティ要件が示されています。
引用:
“通信相手の e を行い、なりすましによる不正な給水器操作を防止する”、“通信内容が漏えいしないように、通信データを f する” - まず“なりすまし”対策として必要なのは、相手が正規の装置かどうかを確認する仕組みです。これは一般に「認証」です。ユーザ認証・サーバ認証・機器認証など形態は複数ありますが、本装置は MCU を内蔵した給水器自身が通信主体となるため、最も直接的な語は「機器認証」と判断できます。
⇒ e = 機器認証 - 次に“通信内容が漏えいしないように”するには、第三者が読めない形でデータを送受信する仕組みが必要です。これは「暗号化」です。通信路暗号化(TLS/SSL など)を施すことで盗聴を防止できます。
⇒ f = 暗号化 - 以上より、解答は
・e:機器認証
・f:暗号化
誤りやすいポイント
- “通信相手”を人と誤認し「ユーザ認証」と答える。実際には装置同士の正当性確認を示す文脈なので「機器認証」が適切です。
- “通信データを~する”を「ハッシュ化」「署名」などと混同する。ハッシュは改ざん検知、署名は真正性・非否認性が主目的であり、漏えい防止には「暗号化」が本質です。
- 認証と暗号化を逆に記述するミス。順序に惑わされず、それぞれの目的(なりすまし防止/漏えい防止)を意識しましょう。
FAQ
Q: 機器認証は具体的にどのような方式がありますか?
A: 代表例は TLS クライアント証明書、デバイスごとの秘密鍵+公開鍵証明書、または共通鍵ベースのチャレンジレスポンス方式などです。
A: 代表例は TLS クライアント証明書、デバイスごとの秘密鍵+公開鍵証明書、または共通鍵ベースのチャレンジレスポンス方式などです。
Q: 暗号化だけでは改ざんは防げますか?
A: 共通鍵暗号化では暗号だけで改ざん検知はできません。通常は MAC(メッセージ認証コード)や TLS のような暗号+ハッシュ統合プロトコルを併用します。
A: 共通鍵暗号化では暗号だけで改ざん検知はできません。通常は MAC(メッセージ認証コード)や TLS のような暗号+ハッシュ統合プロトコルを併用します。
Q: ユーザ認証も不要ですか?
A: 遠隔操作を人が行う場合はユーザ認証も必要です。ただし設問が求める語句は“通信相手の○○”であり、文脈的に機器間認証が主題です。
A: 遠隔操作を人が行う場合はユーザ認証も必要です。ただし設問が求める語句は“通信相手の○○”であり、文脈的に機器間認証が主題です。
関連キーワード: 認証, 暗号化, なりすまし防止, 漏えい対策, TLS


