Интегрируем FreeRtos в ваш проект на STM32F205

Зачем?

Существует довольно неплохая операционная система FreeRtos, про неё сказано много, однако я не нашёл инструкции, как же подружить её с STM32F205RET6T6, потому и решил написать эту инструкцию.

Как?

В примерах, скачиваемых вместе с библиотекой, есть пример для F103 серии под IAR, но для F2xx нет. Надо сказать, что портирование уже сделано, и нам нужно выполнить несколько простых действий и правильно подключить В первую очередь нам понадобится проект, в который будем встраивать систему, лучше конечно чистый. Кроме того, качаем последнюю версию операционки примерно отсюда. Распаковывем архив и берем оттуда папку FreeRtos, помещаем в корень своего проекта(или в другое удобное для вас место). Из папки Demo нужно сохранить файл настроек  FreeRTOS\Demo\CORTEX_STM32F103_IAR\FreeRTOSConfig.h , остальное в паке Demo можно уничтожить. Файл FreeRTOS\Demo\CORTEX_STM32F103_IAR\FreeRTOSConfig.h отправляется в корень проекта, к main.c, а папка Demo окончательно удаляется.

В папке source\portable\IAR\ARM_CM3 лежат файлы необходимые для портирования FreeRtos на CortexM3 и компилятор IAR, естественно, что если у вас другой компилятор, то и путь будет другой. Переносим нужную нам папку непосредственно в FreeRTOS\source\portable и уничтожаем всё содержимое этого каталога, кроме собственно перенесённой папки и папки MemMang, в ней живут функции управления памятью.

Теперь нужно открыть IAR, и добавить в проект исходники FreeRtos, не забыв добавить пути для поиска инклюдов, в моём случае это 2 строки с препроцессоре общем

$PROJ_DIR$\..\FreeRTOS\Source\include
$PROJ_DIR$\..\FreeRTOS\Source\portable\ARM_CM3

и одна строка

$PROJ_DIR$\..\

в предпроцессоре асемблера

Файл croutine.c добавлять не надо.

Кроме того, добавьте в проект одну из реализаций heap.c О том, как выбрать которую, написано тут.  Скорее всего,  heap_2.c вам вполне хватит.

Проект уже должен нормально компилироваться.

Вот структура проекта после всех манипуляций.

Структура проекта FreeRtos на STM32F205

Конечно же, этого недостаточно для работы, кроме этого нужно переопределить названия некоторых прерываний. Сделать это можно тремя дефайнами.

1
2
3
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

Закинем их в FreeRTOSConfig.h и закомментируем эти 3 прерывания в stm32f2xx_it.c, чтобы не смущать компилятор двойным объявлением обработчика.

На этом создание структуры файлов законченно, нужно настроить FreeRtos:
Указать главную тактовую частоту, переопределив значение #define configCPU_CLOCK_HZ
В моём случае это 120 mHz, так что

1
#define configCPU_CLOCK_HZ			( ( unsigned long ) 120000000 )

(Кварц 25, если будете экспериментировать с моим кодом без изменений)

Параметр configTICK_RATE_HZ определяет, как часто будет срабатывать системный таймер, 1000 раз в секунду или 1ms вполне достаточно для большинства задач.

Настройка остальных параметров выходит за рамки этой статьи, а настройки по умолчанию достаточны для старта.

Следующий шаг-подключить операционку в свой код, для это в main.c добавим

1
2
#include "FreeRTOS.h"
#include "task.h"

А в коде инициализации, перед бесконечным циклом запустим задачу

1
2
 xTaskCreate( vTask1, ( signed char * ) "LED", configMINIMAL_STACK_SIZE, NULL,
                     2, ( xTaskHandle * ) NULL);

Ещё нужно описать саму задачу

1
2
3
4
5
6
7
8
9
void vTask1(void *pvParameters) {
 
  for (;;) {
    GPIO_SetBits(GPIOC, GPIO_Pin_10);
    vTaskDelay(500);
    GPIO_ResetBits(GPIOC, GPIO_Pin_10);
    vTaskDelay(500);
  }
}

Последний штрих-запуск планировщика задач, вместо бесконечного цикла

1
vTaskStartScheduler();

Все, светодиод на порту C10 будет мигать с частотой 1герц.
Вы можете скачать архив с моим проектом.

Оставить комментарий