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 documentioctl()的第三个参数有一个适合目标架构的类型:

第三个参数是可选的,推荐_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,.. 应该通过,但不能保证这些命令代码对你有用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...