Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 8 months ago.
hang on write() EP_PENDING forever
did some debugging with LPCExpresso and the mbed gets stuck randomly in an infinite loop on
usbdevice.cpp: USBDevice::write()
/* Send report */ result = endpointWrite(endpoint, buffer, size); if (result != EP_PENDING) { return false; } /* Wait for completion */ do { result = endpointWriteResult(endpoint); } while ((result == EP_PENDING) && configured());
It waits with EP_PENDING forever.
Only way to exit from this is restart mbed from watchdog at the moment.
This happens randomly, usually around the time of a read interrupt event. I am using 2 interrupt endpoints: In and Out @ 1ms rate and 64byte packets.
Question relating to:
2 Answers
7 years, 11 months ago.
We have same problem with STM32F4 device. Have you found any solution to this problem yet?
I would believe it is some mess-up with interrupts as well. We're in progress of investigating the USBDevice code for solution.
my solution was to put writeNB in SOF() event, I believe writeNB cannot be in a loop because it could try to write during a read, so putting it in SOF() keeps it in sync, meaning read/write is always performed sequentially rather than simultaneously.
posted by 09 Mar 2017This is a very interesting topic! I tried USBMSD_SD on mbed. No go. Exported it to CoIDE and built and tested. In the end Windows would recognise it as USB Mass Storage Device but after 20 secs windows timed out with the yellow exclaimation mark and code 10 (Device could not start). Checked it with Message Analyser and discovered that it fails after windows sends the SCSI Inquiry command. My device gets the CBW inquiry command but when it tries to send the result it ends up in an endless loop with EP_PENDING. Windows waits and finally times out with BULK_IN_TRANSFER CANCELLED in Message Analyser.
How did you code it to put the writeNB() in the SOF() event. Can you explain the sequence ?
posted by 13 Mar 20177 years, 11 months ago.
i get the same problem. stm32f407.
bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize) { EP_STATUS result;
if (size > maxSize) { return false; }
if(!configured()) { return false; }
/* Send report */ result = endpointWrite(endpoint, buffer, size);
if (result != EP_PENDING) { return false; }
result = endpointWriteResult(endpoint);
printf("USB Device write %d \r",result);
return (result == EP_COMPLETED); }
the result : 1