STM32 FreeRTOS с LibOpenCM3
У меня есть плата 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
2 ответа
Хорошо, я нашел проблему. Многие примеры полагаются на оптимизацию компилятора для прямого связывания vPortSVCHandler, xPortPendSVHandler и xPortSysTickHandler из FreeRTOS с векторной таблицей, если вы вызываете их внутри собственной реализации вектора обработчика для sv_call_handler, pend_sv_handler и sys_tick_handler. Но это не сработало, функции должны вызываться напрямую процессором.
Добавление этих трех строк в конец файла FreeRTOSConfig.h и удаление моих собственных объявлений функций для векторов устранило проблему:
#define vPortSVCHandler sv_call_handler
#define xPortPendSVHandler pend_sv_handler
#define xPortSysTickHandler sys_tick_handler
Исправление описано здесь: https://www.freertos.org/FreeRTOS_Support_Forum_Archive/January_2012/freertos_LPC1768_FreeRTOS_4964917.html
Он описан в CMSIS, но единственное отличие (в данном случае) - это имена векторов.
Спасибо! Я скопировал/вставил из проекта SPL в libopencm3, и не могу понять, почему у меня возникает ошибка))
Еще раз убеждаюсь, зоопарк библиотек - плохая идея, писать на голом cmsis))
-#define xPortSysTickHandler SysTick_Handler
-#define xPortPendSVHandler PendSV_Handler
-#define vPortSVCHandler SVC_Handler
+#define xPortSysTickHandler sys_tick_handler
+#define xPortPendSVHandler pend_sv_handler
+#define vPortSVCHandler sv_call_handler