我的驱动代码,用echo 1 > led 会出现sh: write error: Invalid argument,内核日志打印出来的问题是prink("error"),没有正确执行。但是写的测试程序能正常执行内核write驱动代码,这里是为什么呢
sh: write error: Invalid argument
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
12条回答 默认 最新
关注 以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。
从你提供的两段代码来看,它们几乎是一样的,但是有一些小的语法错误和潜在的问题。以下是一些可能的原因和解决方案:
-
字符串比较操作符错误: 在C语言中,字符串比较应该使用
==
而不是=
。你的代码中使用了=0
,这实际上是赋值操作,而不是比较操作。修正:
if(strcmp(led_cmd, LED_ON) == 0)
-
错误的字符串终止符: 你在代码中使用了
1ed_cmd[count]= '\0';
,这看起来是一个打字错误。它应该是led_cmd[count] = '\0';
。修正:
led_cmd[count] = '\0';
-
注释错误: 你的代码中有一些注释使用了错误的语法。例如,
/ if (...)
和/ printk("error");
应该是/* if (...) */
和/* printk("error"); */
。修正:
/* if (count > sizeof(led_cmd) - 1) */ { printk("error"); return -EINVAL; }
-
使用未定义的变量: 你的代码中使用了
led_cmd
数组,但是没有初始化它。在写入数据之前,应该将整个数组初始化为0。修正:
memset(led_cmd, 0, sizeof(led_cmd));
-
错误的函数返回类型:
copy_from_user
函数的返回值应该被检查,以确保数据正确地从用户空间复制到内核空间。修正:
if (copy_from_user(led_cmd, buf, count) != 0) { printk("Failed to copy from user\n"); return -EFAULT; }
-
错误的宏定义: 确保
LED_ON
宏定义正确,并且在整个代码中一致。修正:
#define LED_ON "1"
-
内核日志打印: 确保你的内核日志级别和打印的级别相匹配。如果内核日志级别设置得太高,一些信息可能不会被打印出来。
-
编译和加载驱动: 确保你的驱动没有编译错误,并且正确加载到内核中。
-
检查设备文件: 确保设备文件(例如
/led
)已经正确创建,并且你有正确的权限来写入它。 -
检查GPIO设置: 确保GPIO已经正确配置,并且你的设备支持GPIO操作。
修正这些问题后,你的驱动代码应该能够正常工作。如果问题仍然存在,请检查内核日志以获取更多的错误信息,并确保你的硬件设置正确。
解决 1无用-
悬赏问题
- ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
- ¥50 浦育平台scratch图形化编程
- ¥20 求这个的原理图 只要原理图
- ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
- ¥20 微信的店铺小程序如何修改背景图
- ¥15 UE5.1局部变量对蓝图不可见
- ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
- ¥20 sentry如何捕获上传Android ndk 崩溃
- ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
- ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?