0% нашли этот документ полезным (0 голосов)
17 просмотров39 страниц

RTOS

FreeRTOS - это многозадачная операционная система реального времени для встраиваемых систем. Она поддерживает несколько типов многозадачности и имеет гибкий планировщик задач. FreeRTOS портирована на 35 архитектур микроконтроллеров.

Загружено:

akkauntdlyaigrichegotoesche
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
17 просмотров39 страниц

RTOS

FreeRTOS - это многозадачная операционная система реального времени для встраиваемых систем. Она поддерживает несколько типов многозадачности и имеет гибкий планировщик задач. FreeRTOS портирована на 35 архитектур микроконтроллеров.

Загружено:

akkauntdlyaigrichegotoesche
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

FreeRTOS

Многозадачная операционная система


реального времени (ОСРВ)
FreeRTOS

FreeRTOS — многозадачная операционная система реального


времени (ОСРВ) для встраиваемых систем. Портирована на
35 микропроцессорных архитектур. Распространяется под
лицензией MIT с 2017 года. До 2017 года распространялась
под модифицированной лицензией GPL с исключением,
позволяющим разработчику присвоить модифицированный
код операционной системы.

2
FreeRTOS

FreeRTOS поддерживает несколько типов


многозадачности (вытесняющую, кооперативную,
гибридную).
Основой FreeRTOS является планировщик задач,
который предоставляет гибкий функционал для
синхронизации и менеджмента приоритетов задач. Что в
свою очередь упрощает процесс разработки
многофункционального ПО для встраиваемых систем.

3
Планировщик
Исполняемый код под управлением
FreeRTOS реализуется в виде
самостоятельных задач (Task).
Переключение задач осуществляется
по событиям от низкоприоритетного
таймера, в соответствии с текущим
состоянием и приоритетом задачи.

4
Task

Задача может находиться в 4


следующих состояниях:
• Blocked;
• Suspend;
• Ready;
• Running.

5
Blocked
Состояние заблокировано (Blocked state) — планировщик исключает задачу из
основного рабочего цикла, но ожидает событие, которое позволит вывести
задачу из данного состояния. Выход из данного состояния осуществляется по
двум событиям:
• События времени - событие, которое возникает при истечении периода
задержки или при достижении абсолютного времени. Например, задача
может войти в Blocked state для ожидания прохождения 10 миллисекунд
времени.
• События синхронизации - событие, поступившее от другой задачи или от
прерывания. Например, задача может войти в Blocked state для ожидания
поступления данных (появления их в очереди). События синхронизации
покрывают широкий диапазон типов событий.

6
Suspend

Suspend (приостановлено) — задача полностью недоступна для


планировщика, это позволяет максимально освободить ресурсы
планировщика от данной задачи. Переход в данное состояние
осуществляется только через API ОС vTaskSuspend().
Для выхода задачи из данного состояния существует две функции
API vTaskResume() и xTaskResumeFromISR(). Первая функция
вызывается внутри рабочей задачи, а вторая функция вызывается
из аппаратного прерывания, это обусловлено необходимостью
синхронизации событий от прерывания и планировщика ОС.

7
Ready и Running

Ready (готово к запуску) — задача находящаяся в данном


состоянии готова к выполнению и ожидает, когда
планировщик переключит её на выполнение.

Running (запущена) — планировщик передал ресурсы на


выполнения данной задачи.

8
Heap

Task control block (TCB) —


служебная память текущей
задачи.
Stack — стек для локальных
нужд текущей задачи.

9
Heap

В FreeRTOS реализовано 5 видов организации и


менеджмента Heap памяти. От самого простого Heap_1, где
реализован только механизм динамического выделения
памяти pvPortMalloc(), но не реализован механизм
освобождения памяти vPortFree(). До более сложного
Heap_5, где помимо выделения памяти реализованы
функции дефрагментации памяти. Дефрагментация памяти в
данном случае осуществляется в Idel потоке, в то время когда
процессор освобождён от выполнения основной задачи.
10
Инструменты синхронизации
задач
Для синхронизации и обмена данными между задачами, а также
аппаратными прерываниями, как и в любой современной
многозадачной ОС, FreeRTOS предусматривает использование
очередей, мютексов и симафоров.
Данные механизмы синхронизации позволяют реализовать
как блокирующее, так и неблокирующее ожидание на чтение или
запись. Задача ожидающая ресурс в блокирующем режиме
переходит в состояние «Blocked», тем самым приостанавливается
до прихода события синхронизации, и не расходует
процессорные ресурсы.

11
Сборка FreeRTOS
1. Создаем папку, куда 3. Скопируем в эту же
будем копировать папку файл
исходный код FreeRTOS. конфигурации
FreeRTOSConfig.h. Файл
находится по пути
FreeRTOSv10.1.1\FreeRT
OS\Demo\AVR_ATMega3
23_WinAVR

4. Переходим в папку
2. Скопируем portable, и удаляем всё
содержимое папки с содержимое кроме двух
исходным кодом ОС папок GCC и MemMang.
FreeRTOSv10.1.0\FreeRT
OS\Source в созданную
папку.

12
Сборка FreeRTOS
5. Переходим в папку 7. После выполнения
GCC, и удаляем всё кроме предыдущего шага в
папки ATMega323. В этой Solution Explorer
папке должно находиться появится папка, которую
2 файла port.c и наполнили на
portmacro.h предыдущих шагах.
Кликаем правой
клавишей по папке
созданной на 1 шаге, и
выбираем пункт include
6. Переходим в
in Project. После данной
AtmelStudio, и создаём
итерации все файлы и
проект. Далее в Solution
подкаталоги этой
Explorer нажимаем
директории добавятся в
кнопку Show All Files,
проект.
также это можно
сделать в меню Projekt.

13
Сборка FreeRTOS
8. После добавления всех
файлов необходимо
выбрать с каким видом
Heap будем работать.
Выбираем лишнее и
удаляем. После этого
можно отключить
отображение не
проиндексированных
файлов и папок (шаг 6).

9. Далее необходимо
перейти в свойство
проекта.

14
Сборка FreeRTOS
10. В настройках проекта в пункте Directories прописываем все пути внутри созданной папки на этапе 1.

15
Сборка FreeRTOS
11. После того, как проект собран необходимо настроить FreeRTOS для работы с параметрами
соответствующими стенду. За конфигурацию FreeRTOS отвечает файл FreeRTOSConfig.h. В дефайне
configCPU_CLOCK_HZ пропишем частоту контроллера 1Мгц.

Исходный вид Конечный вид

16
Сборка FreeRTOS
12. Последнее действие, которое необходимо сделать, это прописать правильный обработчик прерываний
от таймера в файле port.c. В данном порте по умолчанию FreeRTOS настроена на работу с таймером №1.
При необходимости можно отредактировать данный файл, и настроить работу ОС на любом таймере.

Исходный вид Конечный вид

17
Начало работы с FreeRTOS

Для работы с ОС подключаем необходимые заголовочные файлы.


FreeRTOS.h — данный файл подтягивает настройки с
конфигурационного файла FreeRTOSConfig.h, и на основании этих
настроек используя директивы препроцессора, задействует
необходимый функционал ОС. Объявление этого файла
необходимо производить самым первым, так как остальные
файлы могут содержать неудовлетворённые зависимости.
Task.h — файл содержит необходимые функции для создания и
запуска задач.
18
Начало работы с FreeRTOS

Перед созданием задачи ее необходимо реализовать в виде


функции имеющей прототип:
void vATaskFunction( void *pvParameters );
После того, как задача была написана, её необходимо создать
используя функцию ОС xTaskCreate(). Функция xTaskCreate()
может быть вызвана как до запуска планировщика, так и после
его создания из работающей задачи.
После того, как задача создана, для ее работы необходимо
запустить планировщик функцией vTaskStartScheduler(). Данная
функция является блокирующей, и код написанный после этой
функции не будет выполняться.
19
xTaskCreate

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,


const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask );

20
xTaskCreate

TaskFunction_t pvTaskCode — Указатель на функцию задачи,


которую необходимо добавить в планировщик. Прототип
функции должен иметь следующий вид:
void vATaskFunction( void *pvParameters );

Функция задачи должна находиться в бесконечном цикле, или


заканчиваться вызовом функции vTaskDelete() с параметром
NULL, или указателем на текущую задачу TaskHandle_t.

21
xTaskCreate

const char * const pcName — Имя описывающее создаваемую


задачу. В основном используется при отладке, или если
необходимо получить дескриптор задачи из вне, используя
функцию xTaskGetHandle(). Длинна имени не должна
превышать значения установленного в конфигурационном
файле configMAX_TASK _NAME_LEN.

22
xTaskCreate

unsigned short usStackDepth — Каждая задача имеет свой


отдельный стек. Данный параметр позволяет при создании
задачи выделить в heap необходимое пространство под стек
задачи. Минимальная длинна не должна быть меньшее чем
configMINIMAL_STACK_SIZE, данный параметр определяется в
конфигурационном файле.

23
xTaskCreate

void *pvParameters — Данный параметр позволяет при


создании задачи передать данные в функцию обработчика.
Параметр имеет тип *void, что позволяет передать данные
любого типа.

24
xTaskCreate

UBaseType_t uxPriority — Приоритет с которым будет


выполняться созданная задача. Приоритеты могут быть от 0
до (configMAX_PRIORITIES – 1). configMAX_PRIORITIES
определяется в конфигурационном файле. При установке
приоритета выше максимального, он автоматически
приравнивается к максимально возможному. Не
рекомендуется использовать большое количество уровней
приоритетов, так как это влечёт увеличение затрат
оперативной памяти контроллера.
25
xTaskCreate

TaskHandle_t *pxCreatedTask — данный параметр служит для


получения дескриптора задачи при ее создании. Дескриптор
может быть использован вне тела самой задачи, например
для завершения или привода в состояние suspend, на
которую указывает данный дескриптор.

26
xTaskCreate

Возвращаемое значение — в случае удачного создания


задачи возвращается pdTRUE, в противном случае
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY.

27
Очередь

Очередь (Queue) в FreeRTOS предоставляет


потокобезопасный инструмент для синхронизации и обмена
данными между задачами. Механизм очереди реализован в
виде независимого объекта, в основе которого лежит FIFO
буфер. Очередь доступна на запись и чтение
неограниченному числу задач одновременно (каждая задача
в свой квант времени). Также очередь позволяет
синхронизировать аппаратные прерывания и задачи
планировщика.
28
Очередь

Для работы с очередью необходимо подключить


заголовочный файл queue.h. Объект очереди выполнен в
виде указателя на структуру, и имеет переопределённый тип
данных xQueueHandle. Также как и задачу, перед
использованием необходимо создать очередь, используя
функцию
xQueueHandle xQueueCreate( UBaseType_t uxQueueLength,
UBaseType_t uxItemSize );

29
xQueueCreate

Функция xQueueCreate создаёт объект очереди, и возвращает


указатель на объект, через который можно в дальнейшем
взаимодействовать с очередью. Если не удалось создать
очередь, то функция возвращает NULL. Память под объект
очереди выделяется в куче (heap).
UBaseType_t uxQueueLength — параметр передаёт
максимальное количество элементов очереди.
UBaseType_t uxItemSize — параметр передаёт размер
одного элемента данных в байтах.

30
Запись в очередь

Несмотря на то, что очередь реализована в виде FIFO буфера,


есть возможность добавлять новые элементы в начало очереди.
Для записи в очередь используются специальные функции.
BaseType_t xQueueSend( QueueHandle_t xQueue, const void *
pvItemToQueue, TickType_t xTicksToWait );
BaseType_t xQueueSendToFront( QueueHandle_t xQueue, const void
* pvItemToQueue, TickType_t xTicksToWait );
BaseType_t xQueueSendToBack( QueueHandle_t xQueue, const void
* pvItemToQueue, TickType_t xTicksToWait );
31
Запись в очередь

xQueue — указатель на объект очереди, который получается после ее


создания.
pvItemToQueue — указатель на элемент, который необходимо добавить
в очередь.
xTicksToWait — время, которое необходимо ожидать до освобождения
очереди, если она заполнена. Можно указать 0, тогда очередь не будет
блокировать текущую задачу. Можно передать portMAX_DELAY, тогда
задача перейдёт в состояние suspend и будет бесконечно ожидать, пока
очередь не освободится. Любое другое число будет означать количество
тактов планировщика, которое необходимо ожидать в состоянии
suspend.

32
Запись в очередь
Возвращаемое значение — функции возвращают pdPASS в случае,
если операция удачна, и errQUEUE_FULL, если операция не удалась.
Для записи данных в очередь из обработчика аппаратных прерываний
существуют специализированные функции.
BaseType_t xQueueSendFromISR( QueueHandle_t xQueue, const void
*pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xQueueSendToBackFromISR( QueueHandle_t xQueue, const
void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xQueueSendToFrontFromISR( QueueHandle_t xQueue, const
void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );
33
Чтение в очередь

Чтение очереди всегда осуществляется с головы. В FreeRTOS


реализованы два вида чтения очереди: Receive элемент
очереди считывается и удаляется; Peek элемент очереди
считывается и не удаляется, состояние очереди остаётся
неизменным.
BaseType_t xQueueReceive( QueueHandle_t xQueue, void
*pvBuffer, TickType_t xTicksToWait );
BaseType_t xQueuePeek( QueueHandle_t xQueue, void
*pvBuffer, TickType_t xTicksToWait );

34
Чтение в очередь

pvBuffer — указатель на элемент в который необходимо считать


данные.
Также как и для записи из аппаратного обработчика прерываний для
чтения есть свои функции.
BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void
*pvBuffer, BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void
*pvBuffer )

35
Пример программы

36
Пример программы

37
Лабораторная работа 5

Реализовать работу номер 3 с использованием FreeRTOS.


Работа с LCD, реализация основного алгоритма программы и опрос
кнопок осуществляются в разных Task. Синхронизация и обмен
сообщений реализовать с использованием Queue.

38
Пример оформления отчета
1. Титульный лист
2. Задание на лабораторную работу
3. Текст программ
4. Вывод

Подготовиться к защите лабораторной работы.

39

Вам также может понравиться