The BAQ/Data Acquisition/RTLinux/Tips/RTLinuxとnormal Linuxで関数を共用

Japanese English
Nuclear Physics Data Acquisition Orchestra Gallery Memo Diary Link Home
DAQ System DAQ Module Pulse Shape Analysis RTLinux Linux Device Driver Home
Installation Tips Miscellaneous Example Codes Home

もどる

デバイスドライバを作る時に、RTLinuxとnormal Linux両方で使いたい場合が多々あります。
データ収集システムではReal-Timeで動かしたいハイエンド版(RTLinux)と、とにかくお手軽に動かしたいローエンド版(normal Linux)を作っています。
いずれの版にしても、制御すべきPCIカードは同じなので、PCIカード固有の関数はライブラリにしたいところです。

normal LinuxでもRTLinuxでも、同じくLoadable Moduleの形式をとっているので、使いたい外部関数をexternで宣言しておけば、同じように使うことができます。
以下にその例を示します。

まずは汎用関数のLoadable Moduleを作っておきます。
func.c

int init_module(void){
  printk("Load func\n");
  return 0;
}

void cleanup_module(void){
  printk("unLoad func\n");
}

int testfunc(int a){
  return a*a;
}
次にnormal Linuxからこの汎用関数を呼び出すLoadable Moduleを作ります。
norm.c
extern int testfunc(int a);  /* 普通にexternで外部関数を宣言する */

int a,b;

int init_module(void){

  printk("Load norm : ");
  a = 5;
  b = testfunc(a);
  printk("a=%d , b=%d\n",a,b);
  
  return 0;
}

void cleanup_module(void){
  printk("unLoad norm : ");
  a = 3;
  b = testfunc(a);
  printk("a=%d , b=%d\n",a,b);
}
あと、 Makefileも用意しておきます。
ALL : func norm

func : func.c
	gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/include -Wall -O2 -c func.c

norm : norm.c
	gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/include -Wall -O2 -c norm.c

clean : 
	rm -f func.o norm.o
それぞれをLoadable Moduleとして、別々にコンパイルします。

そうしたら、以下のようにして動作を確認します。

# make
# /sbin/insmod func.o
# /sbin/insmod norm.o
# /sbin/lsmod
# dmesg
# /sbin/rmmod norm
# /sbin/rmmod func

/sbin/lsmod では
Module                  Size  Used by    Tainted: P  
norm                     504   0 (unused)
func                     352   0 [norm]
dmesg では
Load func
Load norm : a=5 , b=25
unLoad norm : a=3 , b=9
unLoad func
のような出力が見られるはずです。
上記はnormal Linuxからfuncを呼び出す例ですが、 RTLinuxのLodable Modulesからも同じように関数をexternで宣言しておけば使うことができます。
RTLinuxから呼び出す場合でもfunc.cは通常のLoadable ModuleとしてコンパイルしておいてOKです。

Last Update: 2005/3/4
Hidetada Baba
baba rarfaxp.riken.jp