Портирование FreeRTOS на другую программную или аппаратную платформу
В этой лекции представлены концепции, связанные с портированием FreeRTOS, и даны инструкции по реализации. В первом разделе подробно описаны требования к портированию FreeRTOS на новый компилятор программного обеспечения или на новую аппаратную платформу. Используя это в качестве основы, мы затем анализируем, как может быть выполнен перенос. В последнем разделе мы исследуем, как FreeRTOS может быть перенесена на новый контроллер.
К концу этой лекции вы должны уметь:
- понимать требования к портированию FreeRTOS на новый компилятор или аппаратную платформу;
- портировать на новый компилятор или аппаратную платформу;
- портировать на новый контроллер/процессор.
Требования для портирования FreeRTOS
Следующая документация необходима для портирования FreeRTOS на другую систему компиляции или другую аппаратную платформу.
-
Информация о новом оборудовании, на которое переносится FreeRTOS:
- Руководство по аппаратному обеспечению
- Руководства пользователя для платы
- Детали портов ввода-вывода
- Другие важные сведения, необходимые для создания новых приложений на этом оборудовании
- Базовый пример соответствующего инструментального потока (tool flow), работающего на этом оборудовании
-
Информация о том, как использовать целевой тулчейн для компиляции и запуска программного обеспечения:
- Простой, базовый пример существующего процесса компиляции и сборки
После получения вышеперечисленной информации пользователь может приступить к созданию приложения на базе FreeRTOS на основе уже имеющейся демонстрационной версии FreeRTOS.
Рекомендуется загрузить последнюю стабильную версию FreeRTOS с или GitHub.
После получения последней версии RTOS можно выполнить шаги, перечисленные в следующем подразделе, чтобы портировать её либо на новое оборудование, либо на новый компилятор, либо на комбинацию того и другого.
Портирование на новый компилятор или аппаратную платформу
Портирование на новую аппаратную платформу
Для переноса на новое оборудование можно выполнить действия, описанные ниже. Убедитесь, что каждый шаг выполнен успешно, прежде чем переходить к следующему.
Шаг 1: Начальная настройка
Выберите существующую демонстрационную версию из каталога релизов FreeRTOS, которая наиболее близка к вашему оборудованию и программному обеспечению. Например, если вы планируете использовать процессор ST32 ARM, то выберите демонстрационную версию, соответствующую этому процессору и тому же набору программных средств, который вы планируете использовать. Убедитесь, что демо-версия компилируется без ошибок, прежде чем вносить в неё какие-либо изменения.
Шаг 2: Изменение портов ввода-вывода
Следующим шагом будет изменение портов ввода-вывода таким образом, чтобы они соответствовали портам на вашей новой плате. Используйте порты ввода-вывода светодиодов, которые используются в демонстрационном примере, и измените их в соответствии с вашей новой платой, чтобы после запуска примера вы могли визуально проверить функциональность.
Функция vParTestInitialise() в файле partest.c содержит конфигурацию режима и направления портов ввода-вывода. Функция prvSetupHardware() в файле main.c содержит более общую конфигурацию оборудования (например, включение тактового генератора для управления периферийным устройством ввода-вывода) и может потребовать некоторой модификации в зависимости от используемых портов.
Внесите необходимые изменения в перечисленные выше функции и напишите небольшой фрагмент кода для проверки того, что нужный порт управляется и что все светодиоды работают так, как ожидается. Этот код пока не использует FreeRTOS, поэтому вы можете использовать свой собственный код в main для проверки работоспособности.
Пример:
int main( void ) { volatile unsigned long ul; /* volatile so it is not optimized away. */ /* Initialize the LED outputs - note that prvSetupHardware() might also have to be called! */ vParTestInitialise(); /* Toggle the LEDs repeatedly. */ for( ;; ) { /* We don't want to use the RTOS features yet, so just use a very crude delay mechanism instead. */ for( ul = 0; ul < 0xfffff; ul++ ) { } /* Toggle the first two LEDs */ vParTestToggleLED( 0 ); vParTestToggleLED( 1 ); } return 0; }
Как только светодиоды начнут мигать, переходите к следующему шагу.
Шаг 3: Использование планировщика FreeRTOS
Если светодиоды мигают, замените функцию main(), показанную на предыдущем шаге, на функцию main() из выбранной вами демонстрации, чтобы представить планировщик FreeRTOS. В демо-версию встроен простой тест на мигание светодиодов, который можно использовать для проверки настройки RTOS.
Тест вспышки создает по одной задаче на светодиод и затем использует эти задачи для управления их миганием. Файл для этого теста можно найти в FreeRTOS/Demo/Common/Minimal/Flash.c. Функция main() содержит вызовы нескольких тестов RTOS. В этой функции закомментируйте все вызовы функций, кроме функции vStartLEDFlashTasks(). Эта функция запускает тест светодиодной вспышки.
Пример кода показан ниже:
/* * Starts all the other tasks, then starts the scheduler. */ int main( void ) { /* Set up the hardware for use with the Olimex demo board. */ prvSetupHardware(); /* Start the demo/test application tasks. */ /* vStartIntegerMathTasks( tskIDLE_PRIORITY ); vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED ); */ vStartLEDFlashTasks( mainLED_TASK_PRIORITY ); /* vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); vStartMathTasks( tskIDLE_PRIORITY ); vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); vStartDynamicPriorityTasks(); vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); */ /* Start the check task - which is defined in this file. */ xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); /* Now all the tasks have been started - start the scheduler. NOTE: Tasks run in System mode, and the scheduler runs in Supervisor mode. The processor MUST be in Supervisor mode when vTaskStartScheduler is called. The demo applications included in the FreeRTOS.org download switch to Supervisor mode prior to main being called. If you are not using one of these demo application projects, then ensure Supervisor mode is used here. */ vTaskStartScheduler(); /* Should never reach here! */ return 0; }
После установки задач с помощью функции vStartLEDFlashTasks() запустите планировщик с помощью vTaskStartScheduler(). Это запустит планировщик RTOS и позволит задачам выполняться по расписанию.
Если светодиоды переключаются, перейдите к следующему шагу.
Шаг 4: Создание пользовательских приложений
Теперь, когда базовый тест запущен, вы можете раскомментировать другие тесты, чтобы увидеть их выполнение. Другие тесты включают в себя исчерпывающий список элементов, которые проверяет RTOS.
Кроме того, теперь можно определять, писать и тестировать свои собственные приложения на этой платформе.
Портирование на другой компилятор или объединение нескольких демо-версий вместе
В этом разделе мы рассмотрим перенос FreeRTOS на другой компилятор или объединение двух или более демо-версий в соответствии с вашими требованиями.
Есть два возможных сценария, которые могут возникнуть у пользователя при портировании FreeRTOS:
- Портирование на другой микроконтроллер, где тот же компилятор используется в текущем проекте и в другом демонстрационном проекте.
- Начиная с нового проекта и используя необходимый компилятор.
В обоих вышеперечисленных случаях можно начать с демонстрационного проекта в качестве ориентира и двигаться дальше. Демонстрационный проект должен быть для того же контроллера, который вы используете или планируете использовать. Демонстрационный проект может быть для того же компилятора, но не обязательно. Демонстрационные проекты являются хорошей отправной точкой для создания нового проекта.
Выбор файлов ядра FreeRTOS для используемого микроконтроллера
Все файлы ядра, специфичные для контроллера, находятся в следующем каталоге: FreeRTOS/source/portable/[compiler]/[microcontroller], где [compiler]?-?используемый компилятор, а [microcontroller]?-?используемое семейство микроконтроллеров. Этот каталог содержит исходный файл port.c, а также сопутствующий заголовочный файл portmacro.h.
Для некоторых компиляторов достаточно только файлов port.c и portmacro.h. Для других (с менее гибкими возможностями) также требуется ассемблерный файл. Он будет называться portasm.s или portasm.asm.
Для портов ARM7 GCC могут потребоваться дополнительные файлы для компиляции некоторых файлов в режиме только ARM (файлы, специфичные для прерываний) и других файлов в режимах ARM или THUMB.
Выбор файлов, специфичных для используемого компилятора
Порты компиляторов, специфичные для встраиваемых систем, имеют определенные расширения языка C, которые могут потребовать файлы расширения, определяющие функции, идентифицирующие функции прерывания. Дерево каталогов FreeRTOS/source/portable содержит файлы, необходимые для расширений языка C, которые специфичны для некоторых контроллеров или компиляторов.
Обязательно добавьте в собираемый проект файлы, специфичные для используемого вами компилятора и контроллера.