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
Другие вопросы по тегам