Странное поведение vTaskDelay() при выключенной оптимизации (O0)
Собираю проект для STM32 на основе libopencm3 и FreeRTOS с одной задачей: мигание светодиодом с задержкой.
void vApplicationStackOverflowHook(TaskHandle_t *pxTask, signed portCHAR *pcTaskName)
{
(void)pxTask;
(void)pcTaskName;
gpio_set(GPIOD, GPIO14);
while (1);
}
void vLedToggle(void *args)
{
while (1)
{
gpio_toggle(GPIOD, GPIO12);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void)
{
clock_setup();
gpio_setup();
xTaskCreate(vLedToggle, "vLedToggle", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
return 0;
}
Сборка производится с отключенной оптимизацией. Как результат - непонятное функционирование ПО (да, включение оптимизации решает проблему, однако хочется разобраться в том, что является причиной такого поведения).
Заметил странность: изначально светодиод отключен, после запуска микроконтроллера он включается, однако больше уже не тухнет. Оказывается, программа попадает в blocking_handler() из-за Hard Fault. Но почему так происходит - непонятно. Отладку произвожу в VSCode средствами JLink. К сожалению, в стеке вызов ничего интересного не обнаружил (последняя функция - мои попытки получить информацию об ошибке; убрав написанный код, программа окажется в blocking_handler()):
Вторая странность: если поставить точку останова на начало задачи, поэтапно проходить все функции (с заходом в каждую), все работает превосходно.
В чем может быть проблема и как с этим справиться, не меняя уровень оптимизации?

