配列変数を使って、入力サイズが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. |