Hi,
platform: STM32F4 on STM32F4 Discovery Board
toolchain: Sourcery G++ Lite
I’m trying to merge two working projects (USB HID Device and a FreeRTOS based simple project) but i’m having some problems. After a quick debug of the project I found out that it’s a problem with the delay function used by USB Module:
void USB_OTG_BSP_uDelay (const uint32_t usec)
{
__IO uint32_t count = 0;
uint32_t utime = (120 * usec / 7);
do
{
if ( ++count > utime )
{
break;
}
}
while (1);
}
After a call to this delay function, the debugger can’t return to the previous level and seems to run continuously. When I pause the execution, the debugger seems to be in a function from task.c vTaskSwitchContext( void ) and I can’t continue the debugging.
I have to mention that I call the USB init function before the creation of tasks and the start of scheduler.
Thank you.
STM32F4 with FreeRTOS and USB HID
STM32F4 with FreeRTOS and USB HID
That delay function is very crude. It does not seem to take into account the clock speed for a start so will presumably only give you microseconds at when the STM32 is running at one particular clock speed. It just a C function though and probably nothing to do with the problem you are seeing.
I have to mention that I call the USB init function before the creation of tasks and the start of scheduler.Are you saying that this error occurs before the scheduler has started? In which case vTaskSwitchContext() should never be running and I would guess that either vTaskSwitchContext() is installed on the wrong interrupt vector, or that your USB driver is using the same vectors as FreeRTOS. FreeRTOS uses the SVC, SysTick and PendSV interrupts, is the driver using any of those?
STM32F4 with FreeRTOS and USB HID
The delay function comes from an official example. It works very well in the project that not include FreeRTOS. Yes, this error occurs before the scheduler has started. I will check the vectors used by USB driver and the necessity of the code from SysTick_Handler (I think I’ve already remove it).
I will come back with an answer asap.
Thank you.
STM32F4 with FreeRTOS and USB HID
The USB driver isn’t using the SVC, SysTick and PendSV. I’ve commented the map of FreeRTOS’s handlers to standard names and the problem persist. In this case the call stack looks like:
WWDG_IRQHandler() at 0x801029c
<signal handler called>() at 0xfffffff9
USB_OTG_BSP_uDelay() at usb_bsp.c:348 0x8003468
USB_OTG_BSP_mDelay() at usb_bsp.c:365 0x8003498
USB_OTG_CoreInit() at usb_core.c:408 0x8003f70
DCD_Init() at usb_dcd.c:128 0x8005462
USBD_Init() at usbd_core.c:144 0x8006542
USBDeviceInit() at usb_comm.c:44 0x80034be
main() at main.c:71 0x8002df4 When I use the FreeRTOS’s handlers the call stack is:
vTaskSwitchContext() at tasks.c:1,836 0x8001e44
PendSV_Handler() at port.c:341 0x800043c
<signal handler called>() at 0xfffffff9
USB_OTG_BSP_uDelay() at usb_bsp.c:348 0x8003468
USB_OTG_BSP_mDelay() at usb_bsp.c:365 0x8003498
USB_OTG_CoreInit() at usb_core.c:408 0x8003f70
DCD_Init() at usb_dcd.c:128 0x8005462
USBD_Init() at usbd_core.c:144 0x8006542
USBDeviceInit() at usb_comm.c:44 0x80034be
main() at main.c:71 0x8002df4 When I use the FreeRTOS’s handlers the call stack is:
vTaskSwitchContext() at tasks.c:1,836 0x8001e44
PendSV_Handler() at port.c:341 0x800043c