私はLinuxカーネルモジュールのcharデバイス(SuSE 13.2 Kernel 3.16.6)と、このデバイスを使用するためのアプリケーションを作成しました。カーネルモジュールでのアクセス
原則として、ドライバ、アプリケーション、および通信が機能します。アプリケーションは、charデバイスを開いたり、読み書きしたり、閉じることができます。
しかし、アプリケーションがいつかモジュールの書き込み機能への参照を「失った」という散発的な問題があります。アプリケーションからモジュールへの3から4(たまにはるかに多くの)書き込みコマンドの後、モジュールの書き込み機能は実行されません。
私は減少し、モジュール内部の書き込み機能:
static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset)
{
printk(KERN_ERR "INSIDE\n");
return 0;
}
そして、私はまたapplcationを削減:
int main (int argc, char **argv)
{
unsigned short buffer=0xffff;
fd = open ("/dev/MYPCI" , O_SYNC | O_RDWR);
OUTPW (0, buffer ,fd);
OUTPW (2, buffer,fd);
OUTPW (4, buffer,fd);
OUTPW (196, buffer,fd);
OUTPW (70000, buffer,fd);
OUTPW (400, buffer,fd);
printf("DEV-Handle: %d\n", fd);
close (fd);
}
int OUTPW (unsigned short ByteAddr, unsigned short value, int fd)
{
int x;
int size = (ByteAddr/2) <<16;
size +=2;
printf ("\nByteAddr:0x%08hX value:0x%08hX size:0x%08hX WRITE-Handle: 0x%04hX\n" , ByteAddr,value,size, &write);
x= write(fd, &value, size) ;
return x;
}
出力はこのロークになります。いつか私は3回読むことができます。いつかは4回読むことができます。
書き込み関数ハンドルは有効です。 1つの書き込みコマンドが失敗すると、それ以降のすべてのコマンドも失敗します。 &をもう一度開くと、(アプリケーション内で)書き込みが一時的に修正されます。
読み取りコマンドでも同じ動作があります。
アイデア?ドライバ機能FWRITE()戻り長
ドライバコードは? –
fWrite()で十分ですか?運転手はかなり長く、内部にはいくつかのノウハウ/商業的に敏感な部品があります。どの部分が必要ですか? – Tobias
ファイルポインタを有効にしていますか?コード内のどこかの競合条件のために破損していますか? –