配列変数を使って、入力サイズが1バイトから4バイトまでの任意のバイト数のデー
タを入力できるdio_read関数とそれを呼び出すdio_tstプログラ
ムを作成する。
現在のプログラムを変更する前に、実験の失敗に備えて、これを保存しておく。
dio_read関数の
を
に変更する。
この変更に対応して、4バイト以上の読み出し要求があったばあいに
4バイトに切り詰めるように、次の処理を変更すること。
inb関数はL.D.D.の249ページの書式が示すようにportからデータの読み
出しをおこなうものである。portには、読み出しをおこなうI/Oポートアドレス
を指定する。例えば、I/Oポートアドレスが16進数の3abc番地であれば、そこか
ら1バイトを読み出すばあいは、
となる。
その次の1バイトを読み出すならば、
となる。
さらに、その次の1バイトを読み出すならば、
となる。
for文を使って、指定したcount数のバイトを読みだすなら、次のように
すればよい。
実験(6)では、初期化モジュールの中で、dio_res.io_address[0]から
I/Oポートアドレスを取得したが、今回は、pdio_res->io_address[0]と
いう形式でI/Oポートアドレスを取得している。
dio_read関数が4バイトまでのデータを読み込むためには次の処理を変更
する必要がある。上記のinb関数の説明を参考にして、指定したcount数
のバイトを読み込める形式にすること。
? の部分は自分で考えること。
変更が終わったらmakeでコンパイルする。
つぎのように、前のドライバを削除し、新しいドライバを格納する。
# rmmod dio_drv
# insmod dio_drv.o
次に、dio_tst.cも4バイト入力のテストプログラムにするために
を
に変更する。
この変更に対応して、次のreadシステムコールも4バイト入力できる形式
にする。
? の部分は自分で考えること。
print文は簡単にするため16進数表示だけにする。
for文を使って、次の形式で4回まで繰り返し表示できるようにする。
この処理における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.
|