next up previous
次へ: レポート 上へ: ドライバとアプリケーションの機能拡張 戻る: 要素数1の配列を使う

要素数4の配列を使う

配列変数を使って、入力サイズが1バイトから4バイトまでの任意のバイト数のデー タを入力できるdio_read関数とそれを呼び出すdio_tstプログラ ムを作成する。

現在のプログラムを変更する前に、実験の失敗に備えて、これを保存しておく。


\begin{boxedminipage}{5cm}
\begin{verbatim}...

dio_read関数の \fbox{\tt unsigned char bdata[1]} \fbox{\tt unsigned char bdata[4]}に変更する。

この変更に対応して、4バイト以上の読み出し要求があったばあいに 4バイトに切り詰めるように、次の処理を変更すること。

\begin{boxedminipage}{4cm}
\begin{verbatim}if (count > 1)
count = 1;\end{verbatim}
\end{boxedminipage}


inb関数はL.D.D.の249ページの書式が示すようにportからデータの読み 出しをおこなうものである。portには、読み出しをおこなうI/Oポートアドレス を指定する。例えば、I/Oポートアドレスが16進数の3abc番地であれば、そこか ら1バイトを読み出すばあいは、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0x3abc);\end{verbatim}
\end{boxedminipage}

となる。

その次の1バイトを読み出すならば、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0x3abc + 1);\end{verbatim}
\end{boxedminipage}

となる。

さらに、その次の1バイトを読み出すならば、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0x3abc + 2);\end{verbatim}
\end{boxedminipage}

となる。

for文を使って、指定したcount数のバイトを読みだすなら、次のように すればよい。

\begin{boxedminipage}{6cm}
\begin{verbatim}int i;for (i = 0, i < count; i++)
inb(0x3abc + i);\end{verbatim}
\end{boxedminipage}


実験(6)では、初期化モジュールの中で、dio_res.io_address[0]から I/Oポートアドレスを取得したが、今回は、pdio_res->io_address[0]と いう形式でI/Oポートアドレスを取得している。

dio_read関数が4バイトまでのデータを読み込むためには次の処理を変更 する必要がある。上記のinb関数の説明を参考にして、指定したcount数 のバイトを読み込める形式にすること。

\begin{boxedminipage}{8.5cm}
\begin{verbatim}bdata[?] = inb(pdio_res->io_address[0]);\end{verbatim}
\end{boxedminipage}

? の部分は自分で考えること。

変更が終わったらmakeでコンパイルする。
つぎのように、前のドライバを削除し、新しいドライバを格納する。

     # rmmod dio_drv
     # insmod dio_drv.o

次に、dio_tst.cも4バイト入力のテストプログラムにするために
\fbox{\tt unsigned char buff[1]} \fbox{\tt unsigned char buff[4]}に変更する。

この変更に対応して、次のreadシステムコールも4バイト入力できる形式 にする。

\begin{boxedminipage}{7cm}
\begin{verbatim}r_count = read(fd, ?, ?);\end{verbatim}
\end{boxedminipage}

? の部分は自分で考えること。

print文は簡単にするため16進数表示だけにする。 for文を使って、次の形式で4回まで繰り返し表示できるようにする。

\begin{boxedminipage}{9cm}
\begin{verbatim}for (i = 0; i < r_count; i++)
printf(''read data(%d) = %X h\n'', ?, ?);
\end{verbatim}
\end{boxedminipage}

この処理におけるprint文の?の部分は自分で考えて、次のような形式で4バイ トを表示できるようにすること。

       read data(1) = xx h
       read data(2) = xx h
       read data(3) = xx h
       read data(4) = xx h

変更が終わったらmakeでコンパイルする。

コンパイルでエラーが出なければ、実行可能イメージとしてのdio_tstア プリケーションが生成されているので、念のためlsコマンドで確かめる こと。

CHK-2101(スイッチ & LEDテストボード)の入力スイッチ1から32までを使って、4 バイトの任意のディジタルデータを設定する。

例えば、1列目のバイトはスイッチ番号の2,4,5(0001,1010)をONにし、 2列目のバイトはスイッチ番号の9,10,12,14(0010,1011)をONにし、 3列目のバイトはスイッチ番号の19,20,21,22(0011,1100)をONにし、 3列目のバイトはスイッチ番号の25,27,28,31(0100,1101)をONにして、

     # ./dio_tst

を実行すれば、
     [dio_open] ga Yobareta.
     [dio_read] ga Yobareta.
     read data(1) = 1A h
     read data(2) = 2B h
     read data(3) = 3C h
     read data(4) = 4D h
     [dio_release] ga Yobareta.
と表示されるはずである。



MANOME Yoichi 平成18年12月26日