STM32 FreeRTOS с LibOpenCM3 - PullRequest
       81

STM32 FreeRTOS с LibOpenCM3

0 голосов
/ 22 сентября 2018

У меня есть плата 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 Ответ

0 голосов
/ 24 сентября 2018

Хорошо, я нашел проблему.Многие примеры полагаются на оптимизацию компилятора, чтобы напрямую связать 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, но единственным отличием (в данном случае) являются имена векторов.

...