天嵌 ARM开发社区

 找回密码
 注册
查看: 2908|回复: 6

请教版主和各位一个关于驱动中的write和read的问题

[复制链接]
workhard123 发表于 2011-12-25 20:46:44 | 显示全部楼层 |阅读模式
本帖最后由 workhard123 于 2011-12-25 21:01 编辑

在驱动中
问题1:
write函数原型中的那个用户空间的地址指针是 const char __user *buff;
按照常理来说,只能存放-128到127这个范围类的数据,但是我从用户空间为什么能传递一个数值大于127的数据?
问题2:
在用户空间使用的write返回值显示写进去多少数据,我实际上写进去128个字节的数据(确实写进去了,在驱动中我查看了数组数据),但是这个函数的返回值是6?这是怎么回事?
希望大家给予指导:)
谢谢


TQ-lkp 发表于 2011-12-25 21:47:22 | 显示全部楼层
本帖最后由 TQ-lkp 于 2011-12-25 21:47 编辑

写的时候是个数组的嘛,一个整形表示的够大吧,四个字节不就行了
至于wirte的返回值跟驱动里面的处理有关系,标准的驱动写的大小应该是没问题,除非是自己写的驱动不严谨没处理好返回值
 楼主| workhard123 发表于 2011-12-26 08:58:26 | 显示全部楼层
TQ-lkp 发表于 2011-12-25 21:47
写的时候是个数组的嘛,一个整形表示的够大吧,四个字节不就行了
至于wirte的返回值跟驱动里面的处理有关系 ...

谢谢您的回复
我再麻烦请教下:
底层驱动中write函数中的指向用户空间的指针是定义成char型,
我在用户空间传入的是一个大于这个类型数据的值,结果还是对的
所以有疑问,您说的定义整型,请问定义哪个为整型
谢谢指教
TQ-lkp 发表于 2011-12-26 08:59:59 | 显示全部楼层
int i = 100000;
char buf[10];
memcpy(buf,&i,sizeof(int));
write(fd,buf,sizeof(int));
 楼主| workhard123 发表于 2011-12-26 22:33:07 | 显示全部楼层
本帖最后由 workhard123 于 2011-12-26 22:36 编辑

版主 你举得例子我懂 恩 但是联系我问的问题 我还是不能理解 基础比较差 见谅
贴上我的代码
实际上是写入了128个数据
但是在用户程序中write函数的返回值是6,不是实际写入的128
希望版主和各位帮忙分析下
谢谢

  1. int main(int argc, char **argv)
  2. {
  3.     int fd = -1;
  4.     int i=0;
  5.     int count=0;
  6.     unsigned char data_buf[128]={0};
  7.     for(i=0;i<128;i++)
  8.     data_buf[i]=i+1;
  9.     fd = open("/dev/leds", O_RDWR);   
  10.     if (fd < 0) {
  11.         printf("Can't open /dev/leds\n");
  12.         return -1;
  13.     }
  14.    count=write(fd,data_buf,128);
  15.     close(fd);
  16.     return 0;  
  17. }
复制代码
驱动代码
  1. static int led_write(struct file *file,const char __user *buf,size_t count,loff_t *f_ops)
  2. {
  3.         int i=0,intervalue=0;        
  4.         if(count>128)
  5.         count=128;
  6.         intervalue=copy_from_user(kbuf,buf,count);
  7. }
复制代码
smilebrother 发表于 2011-12-27 15:11:11 | 显示全部楼层
我觉得这个程序有问题的,unsigned char data_buf[128]={0} 这个定义不对的,必须是  char data_buf[128]={0}, 修改之后在测试。 unsigned char data_buf[128]={0} 做为输入参数,跟led_write(struct file *file,const char __user *buf,size_t count,loff_t *f_ops) 定义不match, 可能会产生未知错误!



 楼主| workhard123 发表于 2011-12-28 11:17:55 | 显示全部楼层
smilebrother 发表于 2011-12-27 15:11
我觉得这个程序有问题的,unsigned char data_buf[128]={0} 这个定义不对的,必须是  char data_buf[128]={ ...

呵呵 你的疑问就是我疑问 关键是我调试时数据是对的
所以我困惑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-28 07:17 , Processed in 1.036066 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表