Странное поведение 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()):

введите сюда описание изображения

введите сюда описание изображения

Вторая странность: если поставить точку останова на начало задачи, поэтапно проходить все функции (с заходом в каждую), все работает превосходно.

В чем может быть проблема и как с этим справиться, не меняя уровень оптимизации?


Ответы (0 шт):