如何解决VxWorks 将结构地址传递给 ioctl
我试图将结构的地址作为 ioctl() 的第三个参数传递。当我尝试在 my_ioctl() 中读取结构成员时,我无法访问它们。我在将地址传递给 ioctl() 之前读取地址,然后将 my_ioctl() 中的地址转换为结构指针类型并将其分配给新的指针变量。然后,当我再次读取该地址时,它与我最初传入的地址不匹配。
所以
MY_STRUCT struct;
MY_STRUCT *pStruct = &struct;
printf("address before ioctl: x%08X\n",(int)pStruct);
if(ioctl(fd,command,(int)pStruct) < 0)
。 . .
然后在驱动程序中
int my_ioctl(struct dev *pDev,int cmd,int arg)
MY_STRUCT *pStruct = (MY_STRUCT*)arg;
printf("addr in ioctl: x08X\n",pStruct);
switch(cmd)
。 . .
为什么地址会改变?
解决方法
将指针转换为整数是一种不好的做法。例如,在 x86_64 上,一个指针是 8 个字节长,一个整数是 4 个字节长......
根据this document,ioctl()的第三个参数有一个适合目标架构的类型:
第三个参数是可选的,推荐_Vx_ioctl_arg_t类型,那么对于VxWorks 32-bits,这是一个32-bits类型,对于VxWorks 64-bits,这是一个64-bits类型。
,几个月前我遇到了同样的问题。这里的问题很可能是某些 IOCTL cmds 被 vxWorks 阻止/已经使用(在版本 7 SR620 上测试)。
检查你是否得到 cmd 代码 64。如果你得到 64 作为 cmd 你的地址,你得到的很可能是垃圾。
一位同事检查了通过的 ioctl cmds,发现 cmds 2,3,7,14,15,19,20,21,.. 应该通过,但不能保证这些命令代码对你有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。