Создание задач и управление ими в операционной системе реального времени FreeRTOS

Цель работы:

  1. Научиться создавать и настраивать проект FreeRTOS в среде Eclipse.
  2. Научиться создавать задачи и запускать ядро операционной системы.
  3. Исследовать принципы распределения процессорного времени в операционных системах реального времени.
  4. Изучить принципы управления задачами в операционной системе реального времени.

Предварительная подготовка к работе

  1. Изучите принципиальную схему стенда LESO6 .
  2. Изучите способы создания в среде Eclipse проекта с готовым makefile.
  3. Изучите способы загрузки исполняемого кода в память программ учебного стенда LESO6.
  4. По рекомендованной литературе изучите принципы действия операционных систем реального времени.
  5. По рекомендованной литературе и справочным данным изучите синтаксис функций создания и управления задачами в операционной системе 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. Напишите программу, реализующую функционал согласно варианту:

  1. Частота мигания светодиода периодично меняется. Максимальную, минимальную частоты и скорость изменения выбрать из соображения возможного визуального контроля.
  2. Все светодиоды горят с разной яркостью.
  3. Яркость одного светодиода периодично плавно изменяется от максимальной до минимальной.
  4. Поочередно 5 миганий первым диодом, 5 – другим.
  5. После запуска все светодиоды по очереди моргнули по 5 раз.
  6. На усмотрение преподавателя скомбинировать функционал предыдущих пунктов.

Содержание отчета

  1. Цель работы.
  2. Текст программы и результат компиляции (используемая память, время компиляции) по каждому пункту работы. Для сокращения отчета повторяющиеся части не приводить.
  3. Выводы по каждому пункту работы.

Контрольные вопросы

  1. Объяснить разницу между кооперативной и вытесняющей многозадачностью.
  2. Объяснить принцип действия планировщика задач.
  3. В каких состояниях может находиться задача?
  4. Что такое квант времени работы планировщика? Как настраивается?
  5. Что такое приоритет задачи. В каких случаях и как влияет приоритет на ход программы?
  6. Как создают и как удаляют задачи?
  7. Объясните структуру проекта с использованием операционной системы FreeRTOS.
  8. Что такое Makefile, какие настройки и настройки чего можно выполнить с его помощью?
  9. Какие настройки выполняются в файле конфигурации FreeRTOSConfig.h
  10. Для чего нужна функция vTaskDelay();

Рекомендуемая литература

  1. А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 1. // Компоненты и Технологии. 2011. №2. С. 96.
  2. А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 2. // Компоненты и Технологии. 2011. №3. С. 109.
  3. А. Курниц. FreeRTOS — операционная система для микроконтроллеров. Часть 3. // Компоненты и Технологии. 2011. №3. С. 109.
  4. А.Г. Николаев. API функции и макросы. Справочник // emproj.com URL: http://emproj.com/modulesFreeRTOS (дата обращения: 11.01.14).
  5. А.Г. Николаев. Настройка операционной системы. Справочник // emproj.com URL: http://emproj.com/Customisation (дата обращения: 11.01.14).
  6. RTOS Implementation // www.freertos.org URL: http://www.freertos.org/implementation/main.html (дата обращения: 11.01.15).

Приложение 1. Файлы проекта

Архив с исходными кодами FreeRTOS и файлами проекта.

Приложение 2

Приложение 3

12 января 2015
Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.