У меня есть плата STM32 BluePill (STM32F103C8 с 8 МГц Quarz), и я пытался загрузить небольшую программу мигания, созданную с помощью LibOpenCM3 и FreeRTOS. Но почему-то FreeRTOS зависает в vTaskStartScheduler (), sys_tick_handler тоже ничего не делает.

Я не использовал отладчик и просто поместил gpio_reset внутри функции sys_tick_handler и после вызова vTaskStartScheduler, чтобы проверить, выполняется ли код, но он, похоже, ничего не сделал, и я не могу понять, почему. Код доступен здесь: https://gitlab.com/feldim2425/stm32-testing

ОБНОВЛЕНИЕ: я отлаживал OpenOCD и выяснил, что он переходит в hard_fault_handler ОБНОВЛЕНИЕ 2: в UsageFault-Status-Register установлен бит NOCP

1
feldim2425 22 Сен 2018 в 21:48

1 ответ

Лучший ответ

Хорошо, я нашел проблему. Многие примеры полагаются на оптимизацию компилятора, чтобы напрямую связать vPortSVCHandler, xPortPendSVHandler и xPortSysTickHandler из FreeRTOS в векторную таблицу, если вы вызываете их внутри своей собственной векторной реализации обработчика для sv_call_handler, pend_sv_handler и sys_tick_handler. Но здесь это не сработало, функции должны вызываться непосредственно процессором.

Добавление этих 3 строк в конец файла FreeRTOSConfig.h и удаление моих собственных объявлений функций для векторов устранило проблему:

#define vPortSVCHandler sv_call_handler
#define xPortPendSVHandler pend_sv_handler
#define xPortSysTickHandler sys_tick_handler

Исправление описано здесь:

feldim2425 24 Сен 2018 в 15:59