Как заставить freeRTOS работать на stm32f4

Я пытаюсь запустить RTOS на своей плате STM32F407VGT6. Я загрузил демо-версию CORTEX_M4F_STM32F407ZG-SK с сайта freeRTOS и записал код с помощью IAR IDE, однако светодиоды не мигают, как ожидалось. во время отладки программы я обнаружил, что программа падает здесь:

vPortStartFirstTask
ldr r0, =0xE000ED08
ldr r0, [r0]
ldr r0, [r0]
msr msp, r0
cpsie i
cpsie f
dsb
isb
svc 0 // The program crashes here!!!!

Я провел некоторое исследование в FAQ по freeRTOS , раздел «Созданное мной приложение компилируется, но не запускается», похоже, решает ту же проблему, но

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

существует в файле FreeRTOSConfig.h. Кто-нибудь сталкивался с такой же проблемой? или ОСРВ, которую я использую, не подходит?

"сбои" = ноль информации. Вы должны изучить регистры отказов и понять, что они говорят вам.
Спасибо @EugeneSh. под "вылетом программы" я подразумеваю, что я не могу перейти к следующей инструкции. Не могли бы вы предоставить мне дополнительную информацию о регистре ошибок? что такое регистры сбоев в stm32F4 и какое значение я должен иметь в этих регистрах?
Прочтите об обработке исключений Hard Fault в Cortex-M и вашем конкретном чипе. Проверьте, так ли это (путем взлома этого ISR).

Ответы (3)

Если ваш код «сбой» в этой строке, то, скорее всего, у вас не установлен обработчик FreeRTOS SVC. Я заметил, что вы включили строку:

#define xPortPendSVHandler PendSV_Handler

Это заменит стандартное имя CMSIS (PendSV_Handler) на имя FreeRTOS, но это предполагает, что ваша векторная таблица использует стандартное имя CMSIS — проверьте, что это так, и что ничто другое в вашем приложении не заменяет векторную таблицу другим один путем перезаписи регистра базового адреса вектора. Между прочим — у FreeRTOS очень активный форум поддержки — меня всегда удивляет, почему люди задают вопросы по FreeRTOS в любом другом месте, кроме того места, где эксперты FreeRTOS наблюдают и готовы ответить на вопросы.

Продукты ARM cortex M4 основаны на базовой архитектуре ARM7.

На самом деле это не так. Как бы это ни сбивало с толку, микроконтроллеры ARM7 используют ядро ​​ARMv4, тогда как микроконтроллеры Cortex-M4 используют ядро ​​ARMv7 :o) Так что этот конкретный FAQ не применим в данном случае.

В часто задаваемых вопросах FreeRTOS, которые вы используете, проверьте пункт 5.

  1. Планировщик ОСРВ аварийно завершает работу при попытке запустить первую задачу. Если вы используете цель ARM7, то процессор должен находиться в режиме супервизора при запуске планировщика ОСРВ.

Продукты ARM cortex M4 основаны на базовой архитектуре ARM7, см. этот справочник в Википедии , и, поскольку ваш фрагмент ясно показывает «vPortStartFirstTask», это, кажется, полностью описывает, что происходит с вашей системой.

Независимо от того, применимо ли это к архитектуре или нет, в справочном руководстве указано, что регистр управления STM32F4 очищается при сбросе, что должно означать, что работа начинается в привилегированном режиме, поэтому кажется, что это может быть проблемой только в том случае, если что-то изменило режим до этого. запуск планировщика.
  1. Вы должны удалить обработчик ISR SVC_Handlerи PendSV_Handlerв stm32f4xx_it.cфайле.

  2. Файлы FreeRTOS должны быть скомпилированы в режиме компилятора c, а не в C++, это означает, что файлы C должны быть скомпилированы как исходный код C, а файлы C++ должны быть скомпилированы как исходный код C++. Вы можете выбрать «Авто (на основе расширения)» в разделе «Язык».

  3. Вы должны добавить корень FreeRTOSConfig.hфайла на вкладку препроцессора раздела ассемблера окна параметров проекта следующим образом:введите описание изображения здесь