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;
}
刚学习嵌入式 程序时照着书写的 已经改了很多错误了 但这个不知道怎么改
#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去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。
但是不用这个也可以,因为,内核在后面的运算中会给你处理的。
LZ完全可以把这个__usr去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。
但是不用这个也可以,因为,内核在后面的运算中会给你处理的。
#11
谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈
#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;
}
刚学习嵌入式 程序时照着书写的 已经改了很多错误了 但这个不知道怎么改
#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去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。
但是不用这个也可以,因为,内核在后面的运算中会给你处理的。
LZ完全可以把这个__usr去掉,看报不报错。他的主要目的就是为了告诉你,这个是真是指向用户空间的。
但是不用这个也可以,因为,内核在后面的运算中会给你处理的。
#11
谢谢您们的解说 问题解决了 我真是个菜鸟 哈哈
#12
恭喜恭喜,问题解决了就好