我写了一个linux内核模块char设备(SuSE 13.2内核3.16.6),以及一个使用这个设备的应用程序。
原则上,驱动程序,应用程序和通信工作。应用程序可以打开,读取,写入和关闭char设备。
但是有一个零星的问题,即应用程序somtime'丢失'对模块写入函数的引用。在从应用程序到模块的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;
}
我还减少了申请:
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次,有时甚至更多。
写函数句柄仍然有效。如果一个写入命令失败,则以下所有命令也将失败。 如果我再次关闭并打开设备(在应用程序内),则写入是临时修复的。
读取命令存在相同的行为。
有什么想法吗?
答案 0 :(得分:0)
在驱动程序函数中,fWrite()返回长度而不是0。
static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset)
{
printk(KERN_ERR "INSIDE\n");
return length;
}