सारांशजीसीसी 4.7.2 अनुकूलन समस्याओं
मैं Sourcery CodeBench लाइट toolchain का नवीनतम संस्करण (जीसीसी हाथ-नन-EABI 4.7.2) का उपयोग कर अनुसूचित जनजाति के USB OTG लाइब्रेरी पोर्टिंग कर रहा हूँ एक कस्टम STM32F4 बोर्ड के लिए।
जब मैं -00 के साथ कोड संकलित करता हूं, तो प्रोग्राम ठीक चलता है। जब मैं -O1 या -O2 के साथ संकलित करता हूं तो यह विफल हो जाता है। जब मैं असफल कहता हूं, तो यह बंद हो जाता है। कोई कठोर गलती नहीं, कुछ भी नहीं (ठीक है, जाहिर है कि यह कुछ कर रहा है लेकिन मेरे पास डीबग करने और पता लगाने के लिए उपयोग करने के लिए एक एमुलेटर नहीं है, मुझे खेद है। मेरी हार्ड गलती हैंडलर को नहीं कहा जा रहा है)।
विवरण
मैं निम्नलिखित कार्य करने के लिए कॉल करने के लिए कोशिश कर रहा हूँ ...
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
USB_OTG_CORE_ID_TypeDef coreID,
USBD_DEVICE *pDevice,
USBD_Class_cb_TypeDef *class_cb,
USBD_Usr_cb_TypeDef *usr_cb);
... लेकिन यह यह समारोह शरीर में बनाने के लिए प्रतीत नहीं होता। (इस "स्टैक-स्मैश" का एक लक्षण है?)
संरचनाओं इस समारोह के लिए पारित निम्नलिखित परिभाषा है:
typedef struct USB_OTG_handle
{
USB_OTG_CORE_CFGS cfg;
USB_OTG_CORE_REGS regs;
DCD_DEV dev;
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
typedef enum
{
USB_OTG_HS_CORE_ID = 0,
USB_OTG_FS_CORE_ID = 1
}USB_OTG_CORE_ID_TypeDef;
typedef struct _Device_TypeDef
{
uint8_t *(*GetDeviceDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetLangIDStrDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetManufacturerStrDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetProductStrDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetSerialStrDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetConfigurationStrDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetInterfaceStrDescriptor)(uint8_t speed , uint16_t *length);
} USBD_DEVICE, *pUSBD_DEVICE;
typedef struct _Device_cb
{
uint8_t (*Init) (void *pdev , uint8_t cfgidx);
uint8_t (*DeInit) (void *pdev , uint8_t cfgidx);
/* Control Endpoints*/
uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req);
uint8_t (*EP0_TxSent) (void *pdev);
uint8_t (*EP0_RxReady) (void *pdev);
/* Class Specific Endpoints*/
uint8_t (*DataIn) (void *pdev , uint8_t epnum);
uint8_t (*DataOut) (void *pdev , uint8_t epnum);
uint8_t (*SOF) (void *pdev);
uint8_t (*IsoINIncomplete) (void *pdev);
uint8_t (*IsoOUTIncomplete) (void *pdev);
uint8_t *(*GetConfigDescriptor)(uint8_t speed , uint16_t *length);
uint8_t *(*GetUsrStrDescriptor)(uint8_t speed ,uint8_t index, uint16_t *length);
} USBD_Class_cb_TypeDef;
typedef struct _USBD_USR_PROP
{
void (*Init)(void);
void (*DeviceReset)(uint8_t speed);
void (*DeviceConfigured)(void);
void (*DeviceSuspended)(void);
void (*DeviceResumed)(void);
void (*DeviceConnected)(void);
void (*DeviceDisconnected)(void);
}
USBD_Usr_cb_TypeDef;
मैं सभी स्रोत इस समस्या के लिए प्रासंगिक कोड को शामिल करने की कोशिश की है। आप पूरे स्रोत कोड देखना चाहते हैं तो आप इसे यहां से डाउनलोड कर सकते हैं: http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stm32_f105-07_f2_f4_usb-host-device_lib.zip
समाधान का प्रयास किया गया
मैं volatile
रूप #pragma GCC optimize ("O0")
, __attribute__((optimize("O0")))
के साथ खेल, और घोषणा की कुछ परिभाषाओं की कोशिश की, लेकिन कुछ भी काम किया। मैं वैसे भी अनुकूलक के साथ अच्छी तरह से खेलने के लिए कोड को संशोधित करना चाहता हूं।
प्रश्न
मैं इसे जीसीसी के अनुकूलक के साथ अच्छा खेलने बनाने के लिए इस कोड को कैसे संशोधित कर सकते हैं?
शायद यह मामला है कि ऑप्टिमाइज़ेशन चालू करना आपके कोड में यूबी को उजागर कर रहा है। यानी, आपका कोड शायद ऑप्टिमाइज़ेशन अक्षम होने के साथ भी गलत है, आपको बस कोई लक्षण नहीं दिख रहा है। – ildjarn
यह एक 3.7 एमबी ज़िप फ़ाइल है, मुझे कोई बात नहीं है कि कोई भी आपके लिए मुफ्त में डीबग करेगा। पोस्ट किया गया कोड केवल कुछ घोषणाएं है और हमें कुछ भी नहीं बताती है। आपको अपना कोड पूर्ण न्यूनतम संभव से कम करना चाहिए, और इसे डीबग करने का प्रयास करें। इसके अलावा, क्या आपने सभी चेतावनियां चालू की हैं, और उन पर ध्यान दिया है? – nos
क्यों कोई एमुलेटर नहीं? आप एक एसटीएम 32 एफ 4 डिस्कोवर बोर्ड में $ 15 निवेश करना चाहते हैं जिसमें ऑन-बोर्ड जेएफई है। मैंने एक का उपयोग नहीं किया है, और मुझे नहीं पता कि सोर्सरी कोडबेन्च लाइट टूलचेन आसानी से काम करेगा या नहीं, लेकिन आपको एसटी यूएसबी ओटीजी लाइब्रेरी को कुछ टूलचैन के साथ बनाया और चलाना चाहिए (अगर सोर्सरी टूलचेन नहीं है) और देखें कि क्या आपके कोड में इंटरफेसिंग के साथ आपको कोई समस्या है या नहीं। –