概要
最新バージョンのSourceryCodeBenchLiteツールチェーン(GCC arm-none-eabi 4.7.2)を使用して、STのUSBOTGライブラリをカスタムSTM32F4ボードに移植しています。
-O0を使用してコードをコンパイルすると、プログラムは正常に実行されます。-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
試みられた解決策
、で遊んで#pragma GCC optimize ("O0")
、__attribute__((optimize("O0")))
特定の定義をとして宣言しようとしましvolatile
たが、何も機能しませんでした。とにかくオプティマイザーでうまく動作するようにコードを変更したいだけです。
質問
このコードを変更して、GCCのオプティマイザーでうまく機能させるにはどうすればよいですか?