ADS中__packed 问题,感觉ads对该关键字支持不好

[复制链接]
5082|7
 楼主| luocolor 发表于 2007-10-21 19:15 | 显示全部楼层 |阅读模式
ADS, ck, AC, ev, des
最近用ads,因为涉及到usb驱动,所以需要使用关键字__packed,但是用这个后会出现错误。阅读了ads<br /><br />的相关的文档,有是有介绍__packed的用法,但我按照这样写后还是有问题。希望哪位能帮助我下,非常<br /><br />感谢!<br /><br />下面是代码:<br />/*&nbsp;Device&nbsp;descriptor&nbsp;*/<br />typedef&nbsp;__packed&nbsp;struct&nbsp;usb_device_descriptor&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bLength;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bDescriptorType;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;bcdUSB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bDeviceClass;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bDeviceSubClass;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bDeviceProtocol;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bMaxPacketSize0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;idVendor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;idProduct;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;bcdDevice;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;iManufacturer;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;iProduct;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;iSerialNumber;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;bNumConfigurations;<br />}&nbsp;USB_DEV_DESC_T;<br /><br />INT32S&nbsp;&nbsp;usb_reset_device(USB_DEV_T&nbsp;*dev){<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;usb_device_descriptor&nbsp;*descriptor;<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;descriptor&nbsp;=&nbsp;(struct&nbsp;usb_device_descriptor&nbsp;*)malloc(sizeof&nbsp;*descriptor);<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;free(descriptor);<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />}<br />按照ads的提示,错误出现在free(descriptor)这里。具体的错误提示是:<br />Error:C2906E:&ltargument&nbsp;1&nbsp;to&nbsp;'free'&gt:implicit&nbsp;cast&nbsp;of&nbsp;pointer&nbsp;loses&nbsp;'__packed'&nbsp;qualifier<br />哪位帮看下。3ks先。<br />
wowow 发表于 2007-10-21 19:37 | 显示全部楼层

re

struct&nbsp;usb_device_descriptor&nbsp;*换成USB_DEV_T&nbsp;*试试?
xieqin 发表于 2007-10-21 21:53 | 显示全部楼层

__packed 放在typedef前

今天一个朋友刚刚问到了这样的问题
 楼主| luocolor 发表于 2007-10-21 22:38 | 显示全部楼层

To: wowow xieqin

试了,还是不行!<br />不过多谢你们的回帖!
wishcom 发表于 2007-10-21 23:17 | 显示全部楼层

试试看这样改行不行

descriptor&nbsp;=&nbsp;(struct&nbsp;usb_device_descriptor&nbsp;*)malloc(sizeof&nbsp;*descriptor);<br />改为:<br />descriptor&nbsp;=&nbsp;(struct&nbsp;usb_device_descriptor&nbsp;*)malloc(sizeof(USB_DEV_DESC_T));<br />
 楼主| luocolor 发表于 2007-10-22 00:38 | 显示全部楼层

another way

google了一大把,结合别人的说法,我理解如下:<br /><br />从提示看,是cast的问题,而不是packed的问题。出现这个问题,提示说会lose&nbsp;packed,意思应该是在调用free的时候会丢弃掉packed,即不会按照packed后的内存组织来free。<br />可以用强制转换free((void&nbsp;*)descriptor);来让编译器通过。<br />但又有一个问题,强制转换后的free,如果按照提示说会不按照packed后的来free,那一些无辜的内存单元不是被free了?
xieqin 发表于 2007-10-23 13:12 | 显示全部楼层

free还有这个功能?

有研究过内存管理吗?&nbsp;比如自己设计malloc和free.<br /><br /><br />一般说来,malloc申请到的内存要么为一个固定的块,要么为一个可变长的块(&nbsp;也就是你的malloc是从块内存池,还是从字节内存池上申请了).&nbsp;<br /><br />free的时候,&nbsp;程序会利用指针去找到相应的块,或者找到相应的起始地址和内存大小,把它们的设置成未用就算完成释放(&nbsp;释放也就是允许被申请的意思了)<br /><br />根本就不会存在&quot;无辜的内存单元不是被free&quot;
wenchang 发表于 2007-10-28 22:29 | 显示全部楼层

应该不是那样理解的

free传入参数本来就是void,你传入一个struct&nbsp;usb_device_descriptor&nbsp;*当然会提示错误,其实可以在ads12里可以通过设置就消除了这类错误提示,但不建议大家这样用,因为这会导致你程序不严密,我是这么认为的,呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

105

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部