The BAQ/Data Acquisition/RTLinux/Tips/RTLinuxとnormal Linuxで関数を共用
もどる
デバイスドライバを作る時に、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