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));

相關文章
相關標籤/搜索