打印

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

[复制链接]
4183|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luocolor|  楼主 | 2007-10-21 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADS, ck, AC, ev, des
最近用ads,因为涉及到usb驱动,所以需要使用关键字__packed,但是用这个后会出现错误。阅读了ads

的相关的文档,有是有介绍__packed的用法,但我按照这样写后还是有问题。希望哪位能帮助我下,非常

感谢!

下面是代码:
/* Device descriptor */
typedef __packed struct usb_device_descriptor 
{
     INT8U  bLength;
     INT8U  bDescriptorType;
     INT16U bcdUSB;
     INT8U  bDeviceClass;
     INT8U  bDeviceSubClass;
     INT8U  bDeviceProtocol;
     INT8U  bMaxPacketSize0;
     INT16U idVendor;
     INT16U idProduct;
     INT16U bcdDevice;
     INT8U  iManufacturer;
     INT8U  iProduct;
     INT8U  iSerialNumber;
     INT8U  bNumConfigurations;
} USB_DEV_DESC_T;

INT32S  usb_reset_device(USB_DEV_T *dev){
    ......
    struct usb_device_descriptor *descriptor;
    ......
    descriptor = (struct usb_device_descriptor *)malloc(sizeof *descriptor);
    ......
    free(descriptor);
    ......
}
按照ads的提示,错误出现在free(descriptor)这里。具体的错误提示是:
Error:C2906E:<argument 1 to 'free'>:implicit cast of pointer loses '__packed' qualifier
哪位帮看下。3ks先。

相关帖子

沙发
wowow| | 2007-10-21 19:37 | 只看该作者

re

struct usb_device_descriptor *换成USB_DEV_T *试试?

使用特权

评论回复
板凳
xieqin| | 2007-10-21 21:53 | 只看该作者

__packed 放在typedef前

今天一个朋友刚刚问到了这样的问题

使用特权

评论回复
地板
luocolor|  楼主 | 2007-10-21 22:38 | 只看该作者

To: wowow xieqin

试了,还是不行!
不过多谢你们的回帖!

使用特权

评论回复
5
wishcom| | 2007-10-21 23:17 | 只看该作者

试试看这样改行不行

descriptor = (struct usb_device_descriptor *)malloc(sizeof *descriptor);
改为:
descriptor = (struct usb_device_descriptor *)malloc(sizeof(USB_DEV_DESC_T));

使用特权

评论回复
6
luocolor|  楼主 | 2007-10-22 00:38 | 只看该作者

another way

google了一大把,结合别人的说法,我理解如下:

从提示看,是cast的问题,而不是packed的问题。出现这个问题,提示说会lose packed,意思应该是在调用free的时候会丢弃掉packed,即不会按照packed后的内存组织来free。
可以用强制转换free((void *)descriptor);来让编译器通过。
但又有一个问题,强制转换后的free,如果按照提示说会不按照packed后的来free,那一些无辜的内存单元不是被free了?

使用特权

评论回复
7
xieqin| | 2007-10-23 13:12 | 只看该作者

free还有这个功能?

有研究过内存管理吗? 比如自己设计malloc和free.


一般说来,malloc申请到的内存要么为一个固定的块,要么为一个可变长的块( 也就是你的malloc是从块内存池,还是从字节内存池上申请了). 

free的时候, 程序会利用指针去找到相应的块,或者找到相应的起始地址和内存大小,把它们的设置成未用就算完成释放( 释放也就是允许被申请的意思了)

根本就不会存在"无辜的内存单元不是被free"

使用特权

评论回复
8
wenchang| | 2007-10-28 22:29 | 只看该作者

应该不是那样理解的

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

105

帖子

0

粉丝