• 検索結果がありません。

割り込み処理

ドキュメント内 Linuxデバイスドライバチュートリアル (ページ 62-68)

第 5 章 アナログ入力 37

5.4 チュートリアル

5.4.3 割り込み処理

5.4.3 割り込み処理

// サンプリングデータの取得

int GetData(int dnum, unsigned long ChCount , unsigned long ulSmplNum) {

int ret;

unsigned long i;

unsigned long GetDatalNum = ulSmplNum;

// サンプリングデータの取得

ret = AdGetSamplingData(dnum, wSmplData, &GetDatalNum);

if (ret) {

printf("AdGetSamplingData error: ret=%Xh¥n", ret);

return -1;

}

// サンプリングデータの表示 for (i = 0; i < ulSmplNum; i++) { printf("%04Xh ", wSmplData[i][0]);

printf("%04Xh ", wSmplData[i][1]);

printf("%04Xh ", wSmplData[i][2]);

printf("%04Xh ", wSmplData[i][3]);

printf("%04Xh ", wSmplData[i][4]);

printf("%04Xh ", wSmplData[i][5]);

printf("%04Xh ", wSmplData[i][6]);

printf("%04Xh ", wSmplData[i][7]);

printf(“%¥n”);

} }

int main(void) {

int ret, dnum;

unsigned long ulSmplNum; // Number of the sampling data acquisition unsigned long i;

// Open a device.

ret = AdOpen(dnum);

if(ret){

printf("Open error: ret=%Xh¥n", ret);

return -1;

}

// コールバック関数の登録

ret = AdSetBoardConfig( dnum, 0, event_proc, 0);

if(ret){

printf("AdSetBoardConfig error: ret=%Xh¥n", ret);

AdClose(dnum);

return -1;

}

// サンプリング情報の設定 ret = SetConfig ( dnum, 8 );

return -1;

}

flag = 1;

// サンプリングスタート.

ret = AdStartSampling(dnum, FLAG_ASYNC);

if (ret) {

AdClose(dnum);

return -1;

}

// コールバック関数が呼び出されるまで待機.

while(flag);

// サンプリングデータの取得

ret = GetData(dnum, wSmplData, &ulSmplNum);

if (ret) {

AdClose(dnum);

return -1;

}

// デバイスのクローズ AdClose(dnum);

return 0;

}

Makefileの作成

下記ソースを「Makefile」という名前で、ソースファイルと同一のディレクトリに保存してください。

INCLUDE = /usr/X11R6/include LIB = /usr/X11R6/lib

CC = gcc all: adevent adevent: adevent.o

$(CC) adevent.o -o adevent –lgpg3100 -lpthread adevent.o: adevent.c

$(CC) -Wall -c adevent.c -o adevent.o clean:

rm -f *.o ¥#* *~ adevent

Step2 コンパイル/実行

ソースコード・Makefileを保存したディレクトリに移動し、コマンドラインから下記コマンドを実行します。

make

コンパイルが成功すると、オブジェクトファイル「adevent.o」と実行ファイル「adevent」が作られます。

※ErrorやWarningが表示された場合はコードの記述に誤りがありますので内容を見直してください。

プログラムを実行するには、以下のコマンドを実行します。

./adevent

プログラムの実行に成功すれば、以下のようにチャンネル1~8までのデータが件数分の出力が行なわれます。

下記に表示しているデータは例となります。実際には入力されているデータが取得されます。

The sampling is successfully completed.

1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h 1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h :

1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h

Step3 プログラムの解説

サンプリングの基本的な処理については、「5.4.2 サンプリング」で解説しているため省略します。

ここでは割り込み機能を使用するために追加したソースコード部分について説明します。

まず、割り込み機能を使用するためには、AdSetBoadConfig関数でコールバック関数を登録する必要があります。

コールバック関数とは、割り込みが発生した場合に呼び出される関数となります。

AdSetBoadConfig関数の書式は下記になります。

int AdSetBoardConfig(

int nDevice, /* デバイス番号 */

int nReserved1, /* 予約 */

PLPADCALLBACK pEventProc, /* ユーザ・コールバック関数 */

int uData /* ユーザデータ */

);

引数名 内 容

nDevice オープンするデバイス番号を指定します。

nReserved1 予約です

pEventProc コールバック関数を指定します。

uData コールバック関数へ渡すユーザデータを指定します。

コールバック関数の登録としては、第三引数にて、呼び出したいコールバック関数を指定します。

プログラムでは、「event_proc」という関数を呼び出すように設定しています。

コールバック関数の書式は、下記である必要があります。

void CallbackProc(

int uData /* ユーザ・データ */

);

ユーザデータは、AdSetBoardConfig関数の第四引数で指定します。

ユーザデータは、コールバック関数の第一引数に値がそのまま渡されます。

どういった場合に使用するかは、複数のデバイスで割り込みを登録した場合、どのデバイスに対する割り込みかを判 別するときに使用します。

本プログラムで、サンプリングが終了した場合に、コールバック関数が呼び出されるため、コールバック関数内で、「The

sampling is successfully completed.」という文字を出力し、サンプリングを終了しているかのフラグとして使用しているグ

ローバル変数のflagを0にしています。

本プログラムでは、AdStartSampling関数で非同期サンプリングとして実行し、while文でコールバック関数がコールされ るまで待機するように作成しています。

コールバック関数が発生すると、サンプリングデータの取得を行い、画面にサンプリングデータを出力するようになって います。

ドキュメント内 Linuxデバイスドライバチュートリアル (ページ 62-68)