LPC11U USB Stack GCC编译后运行成功

LPCWare 提供的LPC11U USB stack是用keil和IAR编译的,如今要使用gcc编译须要修改,目前已经在gcc下编译经过,HID设备能够枚举成功。性能

移植:ui

主要描述符结构体的单字节对齐,keil和GCC方式不同,所以须要修改:spa

// Keil下
typedef   __packed   union   {
    uint16_t   W;
    __packed   struct   {
        uint8_t   L;
        uint8_t   H;
    }   WB;
}   WORD_BYTE;

10 // GCC下
11 struct   _WB {
12         uint8_t   L;
13         uint8_t   H;
14 } __attribute__   ((packed));
15
16 typedef   union   _WORD_BYTE   WORD_BYTE;
17 union   _WORD_BYTE {
18     uint16_t   W;
19     struct   _WB   WB;
20 } __attribute__   ((packed));

GCC不支持左值强制类型运算(这点不敢确定)调试

1 // Keil
2 (uint8_t   * )pD   + =   ((USB_CONFIGURATION_DESCRIPTOR   * )pD) - > wTotalLength;
3
4 // GCC
5   pD   =     (   USB_COMMON_DESCRIPTOR   * )((uint8_t   * )pD   +   ((USB_CONFIGURATION_DESCRIPTOR   * )pD) - > wTotalLength);

GCC没法作对齐强制类型,如下为keil的方式,GCC下作相似动做是不生效的,问题描述里详细介绍it

1 * ((__packed   uint32_t   * )pData)   =   * ((__packed   uint32_t   * )dataptr);

 

 

调试过程遇到几个问题以下:io

usb cable链接后无反应,无中断产生编译

    缘由:没有初始化USB PLL
    解决:在SystemInit时初始化USB PLLgcc

usb cable链接后,当USB device设置地址后,就发生device resetgc

    缘由: USB cable power不足,我是链接在usb hub上的
    解决: 直接连电脑

USB setup过程时,发生HardFault:nio

    缘由:        GCC没法作对齐强制类型: *((__attribute__ ((packed)) uint32_t *)pData) = *((__attribute__ ((packed)) uint32_t *)dataptr);        当pData或者dataptr的地址不是4对齐(uint32_t对齐),就会发生HardFault,Keil经过属性能在编译过程当中处理该问题,GCC没找到相似的方法,那位知道请mail我一下     解决:修改成memcpy(pData, dataptr, sizeof(uint32_t));

相关文章
相关标签/搜索