static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff

时间:2020-11-29 17:02:36
static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff_t *ppos)编译时报错expect',',';'before'*'token      是什么原因 

12 个解决方案

#1


没有包括头文件,或者是有些地方你笔误写错了东西。

#2


应该加哪个头文件

#3


可以贴出部分源代码出来。

#4


#include<linux/module.h>
#include<linux/types.h>
#include<linux/fs.h>
#include<linux/errno.h>
#include<linux/mm.h>
#include<linux/sched.h>
#include<linux/init.h>
#include<linux/cdev.h>
#include<asm/io.h>
#include<asm/system.h>
#include<asm/uaccess.h>
#include<linux/moduleparam.h>
#include<linux/kernel.h>
#include<linux/slab.h>

#define GLOBALMEM_SIZE 0x1000
#define MEM_CLEAR 0x1
#define GLOBALMEM_MAJOR 254

static int globalmem_major=GLOBALMEM_MAJOR;
struct globalmem_dev
{
struct cdev cdev;
unsigned char mem[GLOBALMEM_SIZE];
};

struct globalmem_dev *globalmem_devp;
int globalmem_open(struct inode *inode,struct file *filp)
{
filp->private_data=globalmem_devp;
return 0;
}

int globalmem_release(struct inode *inode,struct file *filp)
{
return 0;
}
 static int globalmem_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
 {
  switch (cmd)
  {
  case MEM_CLEAR:
  memset(globalmem_devp->mem,0,GLOBALMEM_SIZE);
  printk(KERN_INFO "globalmem is set to zero\n");
  break;
  default:
  return -EINVAL;
  }
 }
 
 static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff_t *ppos)
 {
  unsigned long p= *ppos;
  unsigned int count=size;
  int ret=0;
  struct globalmem_dev *dev=filp->private_data;
 
  if(p>=GLOBALMEM_SIZE)
  return count ? -ENXIO:0;
  if(count>GLOBALMEM_SIZE)
  count=GLOBALMEM_SIZE-p;
 
  if(copy_to_usr(buf,(void*)(dev->mem+p),count))
  {
  ret=-EFAULT;
  }
  else
  {
  *ppos+=count;
  ret=count;
  printk(KERN_INFO"read %d bytes(s) from %d\n",count,p);
  }
   return ret;
}
static ssize_t globalmem_write(struct file,*filp,const char __usr *buf,size_t size,loff_t *ppos)
{
  unsigned long p=*ppos;
  unsigned int count=size;
  int ret=0;
  struct globalmem_dev *dev=filp->private_data;
 
  if(p>=GLOBALMEM_SIZE)
  return count ? -ENXIO:0;
  if(count>GLOBALMEM_SIZE)
  count=GLOBALMEM_SIZE-p;
 
  if(copy_from_usr(dev->mem+p,buf,count))
  {
  ret=-EFAULT;
  }
  else
  {
  *ppos+=count;
  ret=count;
  printk(KERN_INFO"write %d bytes(s) from %d\n",count,p);
  }
   return ret;
}
刚学习嵌入式 程序时照着书写的 已经改了很多错误了 但这个不知道怎么改 

#5


static ssize_t globalmem_read(struct file *filp, char __usr *buf,size_t size,loff_t *ppos)

楼主,红色部分是不是有问题哦

#6


static ssize_t globalmem_read(struct file *filp, char __usr *buf,size_t size,loff_t *ppos)

楼主,红色部分是不是有问题哦

#7


没有问题吧。_ _usr 就是这样的   如果有问题您建议怎么改啊

#8


没有问题。按你错误信息来看应该是哪里语法出问题了,看半天看不出。帮不上忙了

#9


你有没有邮箱啊 我给你发过去 您运行一下 我刚接触嵌入式 问题很多

#10


__usr这个确实没问题,但是也不能保证所有版本的内核都认识。

LZ完全可以把这个__usr去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。

但是不用这个也可以,因为,内核在后面的运算中会给你处理的。

#11


谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈

#12


引用 11 楼 crazy_srong 的回复:
谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈


static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff

恭喜恭喜,问题解决了就好

#1


没有包括头文件,或者是有些地方你笔误写错了东西。

#2


应该加哪个头文件

#3


可以贴出部分源代码出来。

#4


#include<linux/module.h>
#include<linux/types.h>
#include<linux/fs.h>
#include<linux/errno.h>
#include<linux/mm.h>
#include<linux/sched.h>
#include<linux/init.h>
#include<linux/cdev.h>
#include<asm/io.h>
#include<asm/system.h>
#include<asm/uaccess.h>
#include<linux/moduleparam.h>
#include<linux/kernel.h>
#include<linux/slab.h>

#define GLOBALMEM_SIZE 0x1000
#define MEM_CLEAR 0x1
#define GLOBALMEM_MAJOR 254

static int globalmem_major=GLOBALMEM_MAJOR;
struct globalmem_dev
{
struct cdev cdev;
unsigned char mem[GLOBALMEM_SIZE];
};

struct globalmem_dev *globalmem_devp;
int globalmem_open(struct inode *inode,struct file *filp)
{
filp->private_data=globalmem_devp;
return 0;
}

int globalmem_release(struct inode *inode,struct file *filp)
{
return 0;
}
 static int globalmem_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
 {
  switch (cmd)
  {
  case MEM_CLEAR:
  memset(globalmem_devp->mem,0,GLOBALMEM_SIZE);
  printk(KERN_INFO "globalmem is set to zero\n");
  break;
  default:
  return -EINVAL;
  }
 }
 
 static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff_t *ppos)
 {
  unsigned long p= *ppos;
  unsigned int count=size;
  int ret=0;
  struct globalmem_dev *dev=filp->private_data;
 
  if(p>=GLOBALMEM_SIZE)
  return count ? -ENXIO:0;
  if(count>GLOBALMEM_SIZE)
  count=GLOBALMEM_SIZE-p;
 
  if(copy_to_usr(buf,(void*)(dev->mem+p),count))
  {
  ret=-EFAULT;
  }
  else
  {
  *ppos+=count;
  ret=count;
  printk(KERN_INFO"read %d bytes(s) from %d\n",count,p);
  }
   return ret;
}
static ssize_t globalmem_write(struct file,*filp,const char __usr *buf,size_t size,loff_t *ppos)
{
  unsigned long p=*ppos;
  unsigned int count=size;
  int ret=0;
  struct globalmem_dev *dev=filp->private_data;
 
  if(p>=GLOBALMEM_SIZE)
  return count ? -ENXIO:0;
  if(count>GLOBALMEM_SIZE)
  count=GLOBALMEM_SIZE-p;
 
  if(copy_from_usr(dev->mem+p,buf,count))
  {
  ret=-EFAULT;
  }
  else
  {
  *ppos+=count;
  ret=count;
  printk(KERN_INFO"write %d bytes(s) from %d\n",count,p);
  }
   return ret;
}
刚学习嵌入式 程序时照着书写的 已经改了很多错误了 但这个不知道怎么改 

#5


static ssize_t globalmem_read(struct file *filp, char __usr *buf,size_t size,loff_t *ppos)

楼主,红色部分是不是有问题哦

#6


static ssize_t globalmem_read(struct file *filp, char __usr *buf,size_t size,loff_t *ppos)

楼主,红色部分是不是有问题哦

#7


没有问题吧。_ _usr 就是这样的   如果有问题您建议怎么改啊

#8


没有问题。按你错误信息来看应该是哪里语法出问题了,看半天看不出。帮不上忙了

#9


你有没有邮箱啊 我给你发过去 您运行一下 我刚接触嵌入式 问题很多

#10


__usr这个确实没问题,但是也不能保证所有版本的内核都认识。

LZ完全可以把这个__usr去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。

但是不用这个也可以,因为,内核在后面的运算中会给你处理的。

#11


谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈

#12


引用 11 楼 crazy_srong 的回复:
谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈


static ssize_t globalmem_read(struct file *filp,char __usr *buf,size_t size,loff

恭喜恭喜,问题解决了就好