В общем, писал я себе, писал прогу, а тут на тебе старый знакомый USBD_malloc. Думал раньше, что обойду его, а нет, настиг проклятый. Данная тема является продолжением Эпопеи в двух частях -
Как меня задрали USB дрова от разработчиков STM.
А теперь ближе к делу.
Разбираясь в неполадках передачи по USB(висит в выделенном цикле, хотя в первый цикл проходит(повезло?)) в нижепоказанной функции, узрел что
TxState содержит какое то невероятное число.
CODE
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
USBD_CDC_HandleTypeDef *pCDC =
(USBD_CDC_HandleTypeDef *)hUsbDevice_0->pClassData;
uint16_t offset = 0;
while (offset < Len)
{
if ((Len-offset)<TX_BUFF_SIZE)
{
while(pCDC->TxState);
USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf + offset, Len-offset);
if (USBD_CDC_TransmitPacket(hUsbDevice_0) != USBD_OK)
return USBD_FAIL;
while(pCDC->TxState);
break;
}
while(pCDC->TxState);
USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf + offset, TX_BUFF_SIZE);
if (USBD_CDC_TransmitPacket(hUsbDevice_0) != USBD_OK)
return USBD_FAIL;
while(pCDC->TxState);
offset+=0x40;
}
return USBD_OK;}
Думаю, что это неправильная инициализация указателя pClassData. Скорее всего он указывает на кусок мусора. Потому что собственно он инициализируется вот так(для тех кто в танке и не стал читать ссыль на предыдущую часть Эпопеи):
Код
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
Сам малок выглядит вот так:
Код
#define USBD_malloc (uint32_t *)USBD_static_malloc
void *USBD_static_malloc(uint32_t size)
{
static uint8_t mem[sizeof(USBD_CDC_HandleTypeDef)];
return mem;
}
Как все успели заметить - это гавнокод(КО не дремлет). В связи с этим, хочу решить проблему иным способом, так чтобы работало всё.
Попробовал создать статическую переменную типа структуры
USBD_CDC_HandleTypeDef(на нестатическую компилятор ругается при линковке, дескать узрел где то чуть ли не сотню дубликатов этого типа там, где он и не используется даже - явный тупняк):
CODE
typedef struct
{
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4]; /* Force 32bits alignment */
uint8_t CmdOpCode;
uint8_t CmdLength;
uint8_t *RxBuffer;
uint8_t *TxBuffer;
uint32_t RxLength;
uint32_t TxLength;
__IO uint32_t TxState;
__IO uint32_t RxState;
}
USBD_CDC_HandleTypeDef;
static USBD_CDC_HandleTypeDef USBD_CDC_Handle;
Также убрал малок:
Код
pdev->pClassData = &USBD_CDC_Handle;
Работать это конешно не стало, как и предполагалось, всё тоже самое что и до замены малока.
Как бы решить эту проблему, подскажите)
P.s. На
буржуйском форуме пишут про баги для STM32F4 Discovery. Якобы явное приведение типа указателя к void* и расширение heap поможет. Сомнительно. Но я к сожалению до понедельника не смогу удостовериться, так как прибор на работе
Update
И кто-нибудь сможет ответить на вопрос, почему если я создам глобальную (не статическую как показано выше) переменную типа USBD_CDC_HandleTypeDef, то вылетают такие ошибки:
Код
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\M25P128.o"
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\main.o"
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usb_device.o"
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_cdc.o"
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_cdc_if.o"
Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_conf.o"
Error while running Linker
что за хрень? в данных файлах нету никакого объявления USBD_CDC_Handle и уж тем более не подключены хедеры с файлами, где эта переменная объявлена.
Сообщение отредактировал Still Enemy - Aug 30 2015, 06:31