Цель работы:
- Научиться создавать и настраивать проект FreeRTOS в среде Eclipse.
- Научиться создавать задачи и запускать ядро операционной системы.
- Исследовать принципы распределения процессорного времени в операционных системах реального времени.
- Изучить принципы управления задачами в операционной системе реального времени.
Предварительная подготовка к работе
- Изучите принципиальную схему стенда LESO6 .
- Изучите способы создания в среде Eclipse проекта с готовым makefile.
- Изучите способы загрузки исполняемого кода в память программ учебного стенда LESO6.
- По рекомендованной литературе изучите принципы действия операционных систем реального времени.
- По рекомендованной литературе и справочным данным изучите синтаксис функций создания и управления задачами в операционной системе FreeRTOS.
Справочный материал
Используемые в лабораторной работе специальные функции FreeRTOS:
void vTaskStartScheduler( void );
Запуск ядра freeRTOS. После вызова ядро получает контроль над задачами. Запускается таймер временных квантов планировщика.
BaseType_t xTaskCreate(TaskFunction_t vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, xTaskHandle *pvCreatedTask );
Создать новую задачу. Новая задача будет добавлена в список задач, которые готовы к выполнению.
vTaskCode
– указатель на функцию, которая будет выступать в роле задачи (task).
"NAME"
– строка, имя задачи. Нужно только для отладки. Размер строки задается в файле конфигурации FreeRTOSConfig.h параметр configMAX_TASK_NAME_LEN.
STACK_SIZE
– размер стека для задачи. Для микроконтроллера семейства AVR измеряется в байтах. Минимальное значение стека задается определением configMINIMAL_STACK_SIZE в файле конфигурации.
&ucParameterToPass
– адрес параметра передаваемого функции.
tskIDLE_PRIORITY
– приоритет, с которым должна запуститься задача. Максимально возможный приоритет определяется в файле конфигурации FreeRTOSConfig.h configMAX_PRIORITIES.
*pvCreatedTask
– параметр используется для возврата хендла (идентификатора) созданной задачи.
Функция возвращает pdPASS (определен в файле projdef.h и равен 1), если задача была создано успешно. Тип возвращаемой переменной BaseType_t, определен в файле платформы portmacro.c и эквивалентен типу char.
void vTaskDelay( const TickType_t xTicksToDelay );
Останавливает задачу на указанное число квантов времени – системных тиков (ticks). Реальное время, в течении которого задача остается заблокированной зависит от частоты тиков (определяется configTICK_RATE_HZ в файле конфигурации). Постоянные portTICK_PERIOD_MS (длительность кванта времени в мс) и configTICK_RATE_HZ могут быть использованы для расчета требуемого числа тиков. Например:
vTaskDelay(500/portTICK_PERIOD_MS); // задержка 500 мс
vTaskDelay(2*configTICK_RATE_HZ); // задержка 2 с
Для того, чтобы можно было использовать функцию vTaskDelay(), в файле конфигурации определение INCLUDE_vTaskDelay должно быть установлено в единицу.
void vTaskSuspend( xTaskHandle pxTaskToSuspend );
Функция приостанавливает задачу. Приостановленная задача не будет выполняться процессором в не зависимости от ее приоритета. Для того, чтобы можно было использовать функцию, в файле конфигурации определение INCLUDE_vTaskSuspend должно быть установлено в единицу.
PxTaskToSuspend
– хендл (идентификатор) задачи, полученый при ее создании. Если в качестве pxTaskToSuspend будет указан NULL, то приостановлена будет текущая задача, то есть та, из которой вызвали функцию.
void vTaskResume( xTaskHandle pxTaskToResume );
Возобновляет работоспособность задачи, приостановленной с помощью функции pxTaskToSuspend(). Для того, чтобы можно было использовать функцию в файле конфигурации определение INCLUDE_vTaskSuspend должно быть установлено в единицу.
Задание к работе в лаборатории
1. Создайте проект. Скачайте и распакуйте архив с исходными кодами FreeRTOS и файлами проекта. В архиве содержится директория FreeRTOSV8.1.2 с исходниками операционной системы и директория lab1, где лежат файл с начальным исходным кодом lab1.c, файл конфигурации FreeRTOSConfig.h, файл gpio.h с макросами для работы с параллельными портами ввода вывода (использование не обязательное) и файл с правилами сборки – Makefile.
В среде Eclipse создаем новый проект, используя вариант проекта с готовым Makefile. В качестве make-файла выбираем файл из директории lab1. Выполните сборку проекта (Build Project), в случае ошибок исправьте их. Сохраните значение использованной памяти программ и данных.
2. Измените исходный код таким образом, чтобы время горения светодиода составляло 5 секунд.
Файл lab1.c содержит функцию vLed0_blink(), содержащую бесконечный цикл, в котором через определенный промежуток времени светодиод LED0 меняет свое значение на противоположное. Задержка выполнена в виде периодического вызова библиотечной функции _delay_ms(10) – задержка на 10 мс. Такая задержка выполняется пустыми циклами. В функции main() на основе vLed0_blink() создается задача (xTaskCreate()), после чего запускается ядро операционной системы (vTaskStartScheduler() ).
После трансляции проекта сохраните значение использованной памяти программ и данных. Загрузите полученный hex-файл в учебный стенд. С помощью секундомера измерьте интервал горения светодиода.
3. По аналогии с первой задачей создайте вторую – управления светодиодом LED1. Интервал смены состояния установите 1с. После трансляции проекта сохраните значение использованной памяти программ и данных.
Загрузите программу в учебный стенд. Измерьте время свечения LED0. Сделайте выводы.
4. Увеличьте приоритет первой задачи. Максимальный приоритет, который можно назначить задаче, определяется константой configMAX_PRIORITIES в файле конфигурации FreeRTOSConfig.h, и не может превышать (configMAX_PRIORITIES-1). Увеличьте configMAX_PRIORITIES до 3. Установите приоритет первой задачи 2. Загрузите программу в учебный стенд. Измерьте время свечения LED0. Сделайте выводы.
Если был изменен конфигурационный файл, требуется полностью пересобрать проект. Выполните последовательно Clean project и Build project.
5. Реализуйте задержку в задачах с помощью функции vTaskDelay(). Замените задержку, реализованную методом пустых циклов, задержкой с помощью специальной функции vTaskDelay(). Для того, чтобы можно было использовать функцию vTaskDelay(), в файле конфигурации FreeRTOSConfig.h установите значение определения INCLUDE_vTaskDelay в единицу.
После трансляции проекта сохраните значение использованной памяти программ и данных. Загрузите программу в учебный стенд, замерьте время свечения светодиода. Выполните для варианта: с разными приоритетами и с одинаковыми. Сделайте выводы.
6. Реализуйте отложенный запуск первой задачи. Для этого с помощью функции vTaskSuspend() остановите выполнение задачи "LED0" сразу же после создания. Используя отдельную переменную для подсчета итерации цикла во второй задаче, через некоторое время запустите первую задачу – функция vTaskResume(). Для того, чтобы можно было использовать функции vTaskResume() и vTaskSuspend(), в файле концигурации установите определение INCLUDE_vTaskSuspend в единицу. Загрузите программу в учебный стенд. Сделайте выводы.
7. Напишите программу, реализующую функционал согласно варианту:
- Частота мигания светодиода периодично меняется. Максимальную, минимальную частоты и скорость изменения выбрать из соображения возможного визуального контроля.
- Все светодиоды горят с разной яркостью.
- Яркость одного светодиода периодично плавно изменяется от максимальной до минимальной.
- Поочередно 5 миганий первым диодом, 5 – другим.
- После запуска все светодиоды по очереди моргнули по 5 раз.
- На усмотрение преподавателя скомбинировать функционал предыдущих пунктов.
Содержание отчета
- Цель работы.
- Текст программы и результат компиляции (используемая память, время компиляции) по каждому пункту работы. Для сокращения отчета повторяющиеся части не приводить.
- Выводы по каждому пункту работы.
Контрольные вопросы
- Объяснить разницу между кооперативной и вытесняющей многозадачностью.
- Объяснить принцип действия планировщика задач.
- В каких состояниях может находиться задача?
- Что такое квант времени работы планировщика? Как настраивается?
- Что такое приоритет задачи. В каких случаях и как влияет приоритет на ход программы?
- Как создают и как удаляют задачи?
- Объясните структуру проекта с использованием операционной системы FreeRTOS.
- Что такое Makefile, какие настройки и настройки чего можно выполнить с его помощью?
- Какие настройки выполняются в файле конфигурации FreeRTOSConfig.h
- Для чего нужна функция vTaskDelay();
Рекомендуемая литература
- А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 1. // Компоненты и Технологии. 2011. №2. С. 96.
- А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 2. // Компоненты и Технологии. 2011. №3. С. 109.
- А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 3. // Компоненты и Технологии. 2011. №3. С. 109.
- А.Г. Николаев. API функции и макросы. Справочник // emproj.com URL: http://emproj.com/modulesFreeRTOS (дата обращения: 11.01.14).
- А.Г. Николаев. Настройка операционной системы. Справочник // emproj.com URL: http://emproj.com/Customisation (дата обращения: 11.01.14).
- RTOS Implementation // www.freertos.org URL: http://www.freertos.org/implementation/main.html (дата обращения: 11.01.15).
Приложение 1. Файлы проекта
Архив с исходными кодами FreeRTOS и файлами проекта.
Приложение 2