Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

FreeRTOS Курниц

.pdf
Скачиваний:
277
Добавлен:
25.03.2015
Размер:
4.26 Mб
Скачать

96

 

компоненты

 

микроконтроллеры

 

 

 

 

 

 

 

 

 

 

 

 

FreeRTOS —

операционная система

для микроконтроллеров

Это первая статья из цикла, посвященного операционной системе для микроконтроллеров FreeRTOS. Статья познакомит читателя с задачами, которые решают операционные системы (ОС) для микроконтроллеров (МК). Освещены вопросы целесообразности применения, преимущества и недостатки, присущие ОС для МК. Представлены возможности FreeRTOS, опи-

Андрей Курниц саны ее особенности, а также приведена структура дистрибутива FreeRTOS kurnits@stim.by с кратким описанием назначения входящих в него файлов и директорий.

Что такое ОС для МК?

Во вторых, микроконтроллер, по сути,

мотки электромотора. Гораздо чаще из МК

 

это однокристальный компьютер с сильно

пытаются «выжать» все, на что он способен,

В нынешний век высоких технологий все

ограниченными аппаратными ресурсами,

а в микроконтроллерное устройство зало

профессионалы знакомы с термином «опе

хотя диапазон выпускаемых МК по про

жить все возможные функции. Количество

рационная система» (ОС). История ОС на

изводительности и объемам памяти очень

функций-задач, одновременно выполняемых

чинается с 1960 х годов. Первые ОС пред

широк. Встречаются как «карлики», напри

МК, может доходить до нескольких десятков.

назначались для больших ЭВМ, а впослед

мер 8 разрядный ATtiny10 с 6 выводами,

И вот тут-то и начинаются проблемы.

ствии — и для персональных компьютеров.

32 байт ОЗУ, 1 кбайт ПЗУ и производитель

Как организовать мультизадачность

Назначением ОС стало заполнение ниши

ностью 12 106 операций в секунду (12 MIPS),

и поочередное выполнение каждой задачи?

между низкоуровневой аппаратурой и вы

так и «гиганты», например 32 разрядный

Как обеспечить запуск задачи через строго

сокоуровневыми программами, они предо

TMS320C28346 c 256 выводами, 512 кбайт ОЗУ

определенные интервалы времени? Как пере

ставляют программам удобный интерфейс

и производительностью 600 106 операций

дать информацию от одной задачи другой?

обращения к системным ресурсам, будь

с плавающей точкой в секунду (600 MFLOPS).

Обычно эти вопросы не встают перед про

то процессорное время, память или устрой

Тем не менее все МК имеют существенные ап

граммистом в начале разработки, а возникают

ства ввода/вывода. С тех пор технологии

паратные ограничения, что предъявляет спец

где-то в середине, когда он запрограммировал

шагнули далеко вперед: целую вычислитель

ифические требования к ОСРВ для МК.

большинство функций будущего устройства,

ную систему (процессор, память, устрой

Их основные особенности:

используя изобретенные им самим средства

ства ввода/вывода) разместили на одном

1. Низкая производительность.

«многозадачности». И тогда заказчик «про

кристалле — появились микроконтроллеры

2. Малый объем ОЗУ и ПЗУ.

сит» добавить еще несколько «маленьких» де

(МК). В соответствии с древним изречени

3. Отсутствие блока управления памятью

талей в работу устройства, например сбор ста

ем «Природа не любит пустоты» удачная

(Memory management unit, MMU), исполь

тистики работы и запись ее на какой-нибудь

концепция ОС не могла не быть применена

зуемого большинством современных ОС,

носитель… Знакомая ситуация?

и к микроконтроллерам. В настоящее время

например Windows и UNIX-подобными.

Преимущества ОСРВ для МК

создано и развивается множество ОС, ори

4. Отсутствие аппаратных средств поддержки

ентированных на выполнение на МК [1, 6].

многозадачности (например, средств бы

 

Однако МК как платформа для выполнения

строго переключения контекста).

Здесь на помощь приходит ОСРВ.

ОС имеет существенные отличия от совре

В третьих, микроконтроллер сам по себе

Рассмотрим преимущества, которые полу

менных компьютеров.

предназначен для выполнения низкоуровне

чил бы наш гипотетический программист,

Прежде всего, МК работает в режиме ре

выхзадач,будьто опроссостояниякнопок,пе

заложив в основу программного обеспечения

ального времени, то есть время реакции ми

редача команды по I2C-интерфейсу или вклю

своего устройства ОСРВ:

кроконтроллерного устройства на внешнее

чение обмотки электромотора. Программа

1. Многозадачность. ОСРВ предоставляет

событие должно быть строго меньше задан

для МК, как правило, обращается к перифе

программисту готовый, отлаженный ме

ной величины и должно быть сопоставимо

рии напрямую, программист имеет полный

ханизм многозадачности. Теперь каждую

соскоростьюпротеканиявнешнихпроцессов.

контроль над аппаратной частью, нет необ

отдельную задачу можно программиро

Типичный пример: время реакции на сраба

ходимости в посредниках между аппаратурой

вать по отдельности так, как будто осталь

тывание датчика давления в промышленной

и прикладной программой. Может показать

ных задач не существует. Например, мож

установке должно быть не более 5 мс, иначе

ся, что операционная система для МК вообще

но разработать архитектуру программы,

произойдет авария. Таким образом, ОС для

не нужна, что любую программу можно на

то есть разбить ее на отдельные задачи

МК — это операционная система реально

писать и без ОС. На самом деле так оно и есть!

и распределить их между командой про

го времени (ОСРВ). К ОСРВ предъявляются

Но есть один нюанс: микроконтроллер ред

граммистов. Программисту не нужно за

жесткие временные требования в отличие

ко используют только для опроса состояния

ботиться о переключении между задачами:

от распространенных ОС общего назначения

кнопок, только для передачи команды по I2C-

за него это сделает ОСРВ в соответствии

(Windows, UNIX-подобные и др.).

интерфейсу или только для включения об

с алгоритмом работы планировщика.

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011

микроконтроллеры

 

компоненты

 

97

 

 

 

 

 

 

 

 

 

 

 

 

2. Временная база. Необходимо отмерять

В этом случае можно применить один

Существуют так называемые официально

интервалы времени? Пожалуйста, лю

из «традиционных» для МК способов орга

поддерживаемые аппаратные платформы —

бая ОСРВ имеет удобный программный

низации многозадачности. Прежде всего, это

официальные порты и неофициальные,

интерфейс для отсчета интервалов вре

циклический алгоритм (round robin) [3], ког

которые поставляются «как есть» и не под

мени и выполнения каких-либо действий

да программист помещает все задачи в тело

держиваются напрямую. Кроме того, для

в определенные моменты времени.

бесконечного цикла. При этом на подпро

одного и того же порта могут поддерживать

3. Обмен данными между задачами.

граммы, реализующие задачи, накладывают

ся несколько средств разработки. Список

Необходимо передать информацию

ся следующие ограничения:

официальных портов и средств разработки

от одной задачи к другой без потерь?

1. Подпрограмма не должна содержать ци

приведен в таблице 1.

Используйте очередь, которая гарантиру

клов ожидания наступления какого-либо

Основные характеристики FreeRTOS:

ет, что сообщения дойдут до адресата в том

события, например прерывания.

1. Планировщик FreeRTOS поддерживает три

объеме и в той последовательности, в ко

2. Подпрограмма должна лишь проверять,

типа многозадачности:

торой были отправлены.

наступило ли событие, и как можно бы

вытесняющую;

4. Синхронизация. Разные задачи обращают

стрее передавать управление следующей

кооперативную;

ся к одному и тому же аппаратному ресур

подпрограмме, то есть завершать свое вы

гибридную.

су? Используйте мьютексы или критиче

полнение.

2. Размер ядра FreeRTOS составляет всего

ские секции для организации совместного

3. Подпрограмма должна сохранять свое те

4–9 кбайт, в зависимости от типа платфор

доступа к ресурсам. Необходимо выпол

кущее состояние (например, в статической

мы и настроек ядра.

нять задачи в строгой последовательности

или глобальной переменной) до следую

3. FreeRTOS написана на языке Си (исходный

или по наступлении определенного собы

щего вызова.

код ядра представлен в виде всего лишь че

тия? Используйте семафоры или сигналы

Таким образом, каждая задача представля

тырех Си-файлов).

для синхронизации задач.

ется в виде конечного автомата. Дальнейшее

4. Поддерживает задачи (tasks) и сопрограм

Кроме этого, одна и та же ОСРВ для МК

развитие эта идея получила в SWITCH-тех-

мы (co-routines). Сопрограммы специально

может выполняться на множестве архитектур

нологии программирования [4, 5].

созданы для МК с малым объемом ОЗУ.

микроконтроллеров. Какое преимущество это

 

5. Богатые возможности трассировки.

дает? Часто приходится решать задачу не как

Резюме

6. Возможность отслеживать факт перепол

разработать устройство с требуемой функ

Итак, применение ОСРВ оправдано в слу

нения стека.

циональностью, а как перенести имеющуюся

чае использования достаточно мощного МК

7. Нет программных ограничений на количе

разработку на новую аппаратную платформу.

при разработке сложного устройства с мно

ство одновременно выполняемых задач.

Это может быть связано с завершением про

жеством функций, например:

8. Нет программных ограничений на количе

изводства того или иного МК (окончание Life

1. Опрос датчиков.

ство приоритетов задач.

cycle), с появлением на рынке МК, включаю

2. Интерфейс с пользователем (простейшие

9. Нет ограничений в использовании прио

щего в состав некоторые блоки, которые ра

клавиатура и дисплей).

ритетов: нескольким задачам может быть

нее были реализованы как отдельные микро

3. Выдача управляющего воздействия.

назначен одинаковый приоритет.

схемы, и т. д. В случае использования ОСРВ

4. Обмен информацией по нескольким вну

10. Развитые средства синхронизации «зада

затраты времени и сил на переход на другую

трисхемным шинам I2C, SPI, 1Wire и др.

ча – задача» и «задача – прерывание»:

платформу будут заметно ниже за счет того,

5. Обмен информацией с внешними устрой

 

– очереди;

что часть кода, связанная с работой ОСРВ,

ствами по интерфейсам RS-232C, RS-485,

 

– двоичные семафоры;

останется без изменений. Изменения коснут

CAN, Ethernet, USB и др.

 

– счетные семафоры;

ся только кода, отвечающего за обращение

6. Реализация высокоуровневых протоко

 

– рекурсивные семафоры;

к встроенной периферии (таймеры, АЦП, по

лов, например TCP/IP, ProfiBus, ModBus,

 

– мьютексы.

следовательный приемопередатчик и т. д.).

CANOpen и др.

11. Мьютексы с наследованием приоритета.

Однако за все надо платить. Использование

7. Поддержка Flash-накопителей и, соответ

12. Поддержка модуля защиты памяти

ОСРВ приводит к определенным накладным

ственно, файловой системы.

(Memory protection unit, MPU) в процес

расходам. Это:

Обзор FreeRTOS

сорах Cortex-M3.

1. Дополнительный расход памяти программ

13. Поставляется с отлаженными примерами

для хранения ядра ОСРВ.

 

проектов для каждого порта и для каждой

2. Дополнительный расход памяти данных

FreeRTOS — это многозадачная, мульти

среды разработки.

для хранения стека каждой задачи, сема

платформенная, бесплатная операционная

14. FreeRTOS полностью бесплатна, моди

форов, очередей, мьютексов и других объ

система жесткого реального времени с откры

фицированная лицензия GPL позволяет

ектов ядра операционной системы.

тым исходным кодом. FreeRTOS была раз

использовать FreeRTOS в проектах без

3. Дополнительные затраты времени процес

работана компанией Real Time Engineers Ltd.

раскрытия исходных кодов.

сора на переключение между задачами.

специально для встраиваемых систем. На мо

15. Документация в виде отдельного доку

Когда можно обойтись

мент написания статьи (версия FreeRTOS 6.1.0)

мента платная, но на официальном сайте

ОС официально поддерживает 23 архитек

[7] в режиме on-line доступно исчерпы

без ОСРВ для МК?

туры и 57 платформ (в подавляющем боль

вающее техническое описание на англий

 

шинстве — микроконтроллеры) [7]. В те

ском языке.

Конечно же, если вам необходимо разра

чение 2008 и 2009 годов произошло более

Работа планировщика FreeRTOS в режи

ботать простейшее устройство, например

77 500 загрузок FreeRTOS с официального

ме вытесняющей многозадачности имеет

индикатор температуры, который будет вы

сайта, что делает ее одной из самых популяр

много общего с алгоритмом переключения

полнять две функции: опрос датчика и ин

ных ОСРВ на сегодня. Бóльшая часть кода

потоков в современных ОС общего назначе

дикацию на 7 сегментный светодиодный

FreeRTOS написана на языке Си, ассемблер

ния. Вытесняющая многозадачность пред

индикатор, то применение ОСРВ в таком

ные вставки минимального объема применя

полагает, что любая выполняющаяся задача

устройстве будет непозволительным расто

ются лишь там, где невозможно применить

с низким приоритетом прерывается готовой

чительством и приведет, в конечном счете,

Си из-за специфики конкретной аппаратной

к выполнению задачей с более высоким при

к удорожанию устройства.

платформы.

оритетом. Как только высокоприоритетная

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011

www.kit e.ru

98

 

компоненты

 

микроконтроллеры

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тетной задаче, что позволяет значительно со

Таблица 1. Список официальных портов FreeRTOS и средств разработки

 

 

 

 

кратить время реакции системы на прерыва

 

 

 

 

 

ние, связанное с внешним событием.

Производитель

Поддерживаемые семейства (ядра)

Поддерживаемые средства разработки

 

 

Для оценки затрат времени, вносимых

 

 

 

 

 

Altera

Nios II

 

Nios II IDE, GCC

 

 

 

планировщиком FreeRTOS, можно срав

 

SAM3 (Cortex-M3)

 

 

 

 

 

 

 

нить два распространенных семейства МК:

 

SAM7 (ARM7)

 

 

 

Atmel

SAM9 (ARM9)

 

IAR, GCC, Keil, Rowley CrossWorks

 

PIC и AVR. Затраты времени складываются

 

AT91

 

 

 

из времени переключения контекста, когда

 

AVR32 UC3

 

 

 

 

 

 

 

планировщик определяет задачу для выпол

 

 

 

 

 

Cortus

APS3

 

Cortus IDE, GCC

 

Energy Micro

EFM32 (Cortex-M3)

IAR

 

нения в следующем кванте времени, и вре

 

Coldfire V2

 

 

 

мени сохранения/восстановления контекста,

 

Coldfire V1

 

 

 

когда текущее состояние задачи (регистры

 

 

 

 

 

Freescale

другие Coldfire

 

Codewarrior, GCC, Eclipse

 

 

 

процессора) сохраняется/извлекается из сте

 

HCS12

 

 

 

 

 

 

 

ка (таблица 2). Замеры приведены для ком

 

PPC405 & PPC440

 

 

Fujitsu

32 бит (например, MB91460)

Softune

 

пиляторов MPLAB PIC18 compiler и WinAVR

 

 

 

 

 

 

 

 

 

 

 

 

16 бит (например, MB96340 16FX)

 

 

соответственно, уровень оптимизации —

Luminary Micro /

Все МК Stellaris на основе ядра Cortex-M3

Keil, IAR, Code Red, CodeSourcery GCC,

 

 

максимальный по скорости.

 

Texas Instruments

Rowley CrossWorks

 

 

 

 

 

 

 

PIC32

 

 

 

Для того чтобы оценить объем ОЗУ, тре

Microchip

PIC24

 

MPLAB C32, MPLAB C30,

 

 

 

 

 

 

 

 

 

 

dsPIC

 

MPLAB C18, wizC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PIC18

 

 

 

Таблица 2. Расход времени на переключение

 

NEC

V850 (32 бит)

 

IAR

 

между задачами

 

 

 

 

 

78K0R (16 бит)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NXP

LPC1700 (Cortex-M3)

GCC, Rowley CrossWorks, IAR, Keil, Red

 

Микроконтроллер

 

Частота тактированияМГц,

 

 

 

сохраненияВремя/ восстановления контекстамкс,

LPC2000 (ARM7)

 

Suite, Eclipse

 

 

 

Время переключения мкс,контекста

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RX600/RX62N

 

GCC, HEW (High Performance Embedded

 

 

 

 

 

 

 

 

Renesas

SuperH

 

 

 

 

 

 

 

 

 

 

Workbench), IAR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

H8/S

 

 

 

 

 

 

 

 

 

 

Silicon Labs (бывший Cygnal)

Сверхбыстрые i8051 совместимые МК

SDCC

 

 

 

 

 

 

 

 

 

STM32 (Cortex-M3)

 

 

 

 

 

 

 

 

 

 

 

 

ATMega323

 

8

 

41,8

 

~8

ST

STR7 (ARM7)

 

IAR, GCC, Keil, Rowley CrossWorks

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PIC18F452

 

20

 

66,2

 

~10

 

STR9 (ARM9)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Texas Instruments

MSP430

 

Rowley CrossWorks, IAR, GCC

 

 

 

 

 

 

 

 

 

PPC405, выполняющийся на Virtex4 FPGA

 

 

буемый для работы FreeRTOS, достаточно

 

 

 

 

 

Xilinx

PPC440, выполняющийся на Virtex5 FPGA

GCC

 

 

привести расчет расхода ОЗУ для следующей

 

Microblaze

 

 

 

 

 

 

 

конфигурации:

 

 

 

 

 

i8086

Любой x86 совместимый процессор в реальном режиме (Real mode)

Open Watcom, Borland, Paradigm

 

 

 

 

 

 

Win32 симулятор

Visual Studio

 

1. Порт для процессоров ARM7, среда раз

 

 

 

 

 

 

 

 

 

 

 

 

работки IAR STR71x.

 

 

 

задача выполнила свои действия, она завер

стоятельно передать управление планиров

2. Полная оптимизация (Full optimization)

шает свою работу или переходит в состояние

щику. Таким образом, высокоприоритетная

включена.

 

 

 

 

 

ожидания, и управление снова получает за

задача будет ожидать, пока низкоприоритет

3. Все компоненты FreeRTOS, кроме сопро

дача с низким приоритетом. Переключение

ная завершит свою работу и отдаст управле

грамм и трассировки, включены.

 

между задачами осуществляется через рав

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

4. 4 приоритета задач.

 

 

 

ные кванты времени работы планировщи

на внешнее событие становится неопреде

Объемы расхода ОЗУ для такой конфигу

ка, то есть высокоприоритетная задача, как

ленным и зависит от того, как долго текущая

рации приведены в таблице 3.

 

только она стала готова к выполнению, ожи

задача будет выполняться до передачи управ

Расход ОЗУ будет существенно ниже при

дает окончания текущего кванта, после чего

ления. Кооперативная многозадачность при

 

 

 

 

 

 

 

управление получает планировщик, который

менялась в семействе ОС Windows 3.x.

Таблица 3. Объемы ОЗУ,

 

 

 

передает управление высокоприоритетной

Вытесняющая и кооперативная концеп

 

 

 

требуемые для работы FreeRTOS

 

задаче.

 

ции многозадачности объединяются вместе

 

 

 

 

 

 

 

Таким образом, время реакции FreeRTOS

в гибридной многозадачности, когда вызов

Объект

 

 

Расход ОЗУ, байт

на внешние события в режиме вытесняющей

планировщика происходит каждый квант

 

 

 

Планировщик (sheduler)

236

 

многозадачности — не больше одного кванта

времени, но, в отличие от вытесняющей

 

 

 

 

 

Каждая дополнительная очередь

76 + память для хранения

времени планировщика, который можно за

многозадачности, программист имеет воз

всех элементов очереди

(queue)

 

 

 

 

(зависит от размера очереди)

давать в настройках. По умолчанию он равен

можность сделать это принудительно в теле

 

 

 

 

Каждая дополнительная задача

64 + стек задачи

1 мс.

 

задачи. Особенно полезен этот режим, ког

(task)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если готовы к выполнению несколько за

да необходимо сократить время реакции си

 

 

 

 

 

 

 

дач с одинаковым приоритетом, то в таком

стемы на прерывание. Допустим, в текущий

работе FreeRTOS на 8 и 16 битных архитек

случае планировщик выделяет каждой из них

момент выполняется низкоприоритетная за

турах.

 

 

 

 

 

по одному кванту времени, по истечении

дача, а высокоприоритетная ожидает насту

Кроме самой FreeRTOS, существуют

которого управление получает следующая

пления некоторого прерывания. Далее про

также ее коммерческие версии: SafeRTOS

задача с таким же приоритетом, и так далее

исходит прерывание, но по окончании ра

и OpenRTOS. SafeRTOS — это ОСРВ, соот

по кругу.

 

боты обработчика прерываний выполнение

ветствующая уровню функциональной без

Кооперативная многозадачность отлича

возвращается к текущей низкоприоритетной

опасности SIL3, имеющая такую же функ

ется от вытесняющей тем, что планировщик

задаче, а высокоприоритетная ожидает, пока

циональную модель, что и FreeRTOS, и ори

самостоятельно не может прервать выполне

закончится текущий квант времени. Однако

ентированная на применение в системах

ние текущей задачи, даже если появилась го

если после выполнения обработчика преры

с высокими требованиями к безопасности,

товая к выполнению задача с более высоким

вания передать управление планировщику,

например в медицинской и аэрокосмической

приоритетом. Каждая задача должна само

то он передаст управление высокоприори

отраслях. OpenRTOS отличается от FreeRTOS

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011

микроконтроллеры

 

компоненты

 

99

 

 

 

 

 

 

 

 

 

 

 

 

лишь тем, что поставляется под коммерче

1. tasks.c — планировщик, реализация меха

«с нуля» понадобятся поддиректории /Source/

ской лицензией, с гарантией производителя

низма задач.

Portable/GCC/MSP430F449 и /Source/Portable/

и отменяет некоторые несущественные огра

2. queue.c — реализация очередей.

MemMang. Все остальные поддиректории из

ничения, присущие FreeRTOS. Подробно

3. list.c — внутренние нужды планировщи

директории /Source/Portable не нужны и мо

с особенностями SafeRTOS и OpenRTOS

ка, однако функции могут использоваться

гут быть удалены.

 

можно ознакомиться в [8].

и в прикладных программах.

Если же планируется модифицировать

Конечно, FreeRTOS — это далеко не един

4. croutine.c — реализация сопрограмм (мо

существующий демонстрационный проект

ственный выбор для разработчика. В на

жет отсутствовать в случае, если сопро

(что, собственно, и рекомендуется сделать

стоящее время существует множество дру

граммы не используются).

в начале изучения FreeRTOS), то понадобят

гих ОСРВ для МК, среди которых можно

Заголовочные файлы, которые находятся

ся также поддиректории /Demo/msp430_GCC

назвать uC/OS-II, μClinux, Salvo, jacOS и др.

в директории Source/Include:

и /Demo/Common. Остальные поддиректо

[6]. Однако обсуждение достоинств и недо

1. tasks.h, queue.h, list.h, croutine.h — заголо

рии, находящиеся в /Demo, не нужны и могут

статков этих ОС выходит за рамки данной

вочные файлы соответственно для одно-

быть удалены.

 

статьи.

именных файлов с кодом.

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

С чего начать?

2. FreeRTOS.h — содержит препроцессорные

ся использовать makefile (или файл проек

директивы для настройки компиляции.

та среды разработки) от соответствующего

 

 

3. mpu_wrappers.h — содержит переопреде

демонстрационного проекта как отправную

Начать разработку микроконтроллерного

ления функций программного интерфейса

точку. Целесообразно исключить из сборки

устройства, работающего под управлением

(API-функций) FreeRTOS для поддержки

(build) файлы из директории /Demo, заменив

FreeRTOS, можно с загрузки ее последней

модуля защиты памяти (MPU).

их своими, а файлы из директории /Source

версии по адресу [9]. Дистрибутив FreeRTOS

4. portable.h — платформенно-зависимые на

оставить нетронутыми. Это гарантия того,

доступен в виде обычного или самораспа

стройки.

что все исходные файлы ядра FreeRTOS бу

ковывающегося ZIP-архива. Дистрибутив

5. projdefs.h — некоторые системные опреде

дут включены в сборку и настройки компи

содержит непосредственно код ядра

ления.

лятора останутся корректными.

 

(в виде нескольких заголовочных файлов

6. semphr.h — определяет API-функции для

Следует упомянуть также о заголовочном

и файлов с исходным кодом) и демонстраци

работы с семафорами, которые реализо

файле FreeRTOSConfig.h, который находит

онные проекты (по одному проекту на каж

ваны на основе очередей.

ся в каждом демонстрационном проекте.

дую среду разработки для каждого порта).

7. StackMacros.h — содержит макросы для

FreeRTOSConfig.h содержит определения

Далее следует распаковать архив в любое

контроля переполнения стека.

(#define), позволяющие произвести настрой

подходящее место на станции разработки.

Каждая аппаратная платформа требу

ку ядра FreeRTOS:

 

Несмотря на достаточно большое количе

ет небольшой части кода ядра, которая реа

1. Набор системных функций.

 

ство файлов в архиве (5062 файла для вер

лизует взаимодействие FreeRTOS с этой плат

2. Использование сопрограмм.

 

сии 6.1.0), структура директорий на самом

формой. Весь платформенно-зависимый код

3. Количество приоритетов задач и сопро

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

находится в поддиректории /Source/Portable,

грамм.

 

устройства на 2–3 архитектурах в 1–2 средах

где он систематизирован по средам разработ

4. Размеры памяти (стека и кучи).

 

разработки, то бóльшая часть файлов, относя

ки (IAR, GCC и т. д.) и аппаратным платфор

5. Тактовая частота МК.

 

щихся к демонстрационным проектам и раз

мам(например,AtmelSAM7S64,MSP430F449).

6. Период работы планировщика — квант

личным средам разработки, не понадобится.

К примеру, поддиректория /Source/Portable/

времени, выделяемый каждой задаче для

Подробная структура директорий приве

GCC/ATMega323 содержит файлы port.c

выполнения, который обычно равен 1 мс.

дена на рисунке.

и portmacro.h, реализующие сохранение/вос

Отключение некоторых системных функ

Весь исходный код ядра находится в ди

становление контекста задачи, инициализа

ций и уменьшение количества приоритетов

ректории /Source. Его составляют следующие

цию таймера для создания временной базы,

позволяет уменьшить расход памяти про

файлы:

инициализацию стека каждой задачи и дру

грамм и данных.

 

 

 

гие аппаратно-зависимые функции для ми

В дистрибутив FreeRTOS включены так

 

 

кроконтроллеров семейства mega AVR и ком

же средства для конвертирования трас

 

 

пилятора WinAVR (GCC).

сировочной информации, полученной

 

 

Отдельно следует выделить поддиректо

от планировщика, в текстовую форму (ди

 

 

рию /Source/Portable/MemMang, в которой со

ректория /TraceCon) и текст лицензии (ди

 

 

держатся файлы heap_1.c, heap_2.c, heap_3.c,

ректория /License).

 

 

 

реализующие 3 различных механизма вы

Выводы

 

 

 

деления памяти для нужд FreeRTOS, которые

 

 

 

будут подробно описаны позже.

 

 

 

 

В директории /Demo находятся готовые

С помощью первой статьи цикла читатель

 

 

к компиляции и сборке демонстрационные

мог познакомиться с операционной системой

 

 

проекты (Demo 1, Demo 2, …, Demo N на ри

для микроконтроллеров FreeRTOS. Показаны

 

 

сунке). Общая часть кода для всех демонстра

ее основные особенности. Описано содер

 

 

ционных проектов выделена в поддиректо

жимое дистрибутива FreeRTOS. Приведены

 

 

рию /Demo/Common.

основные шаги, с которых следует начинать

 

 

Чтобы использовать FreeRTOS в своем про

разработку устройства, работающего под

 

 

екте, необходимо включить в него файлы ис

управлением FreeRTOS.

 

 

 

ходного кода ядра и сопутствующие заголо

В следующих публикациях внимание бу

 

 

вочные файлы. Нет необходимости модифи

дет уделено механизму многозадачности,

 

 

цировать их или понимать их реализацию.

а именно задачам и сопрограммам. Будет

Рисунок. Структура директорий FreeRTOS

 

Например, если планируется использо

приведен образец работы планировщика

 

вать порт для микроконтроллеров MSP430

на примере микроконтроллеров AVR фирмы

после установки на станцию разработки

 

 

 

и GCC-компилятор, то для создания проекта

Atmel и компилятора WinAVR (GCC).

n

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011

www.kit e.ru

100

 

компоненты

 

микроконтроллеры

 

 

 

 

 

 

 

 

 

 

 

 

Литература

4.

http://ru.wikipedia.org/wiki/Switch-технология

 

 

5.

Татарчевский В. Применение SWITCHтехнологии при разработке

1.

Сорокин С. Как много ОСРВ хороших… // Современные технологии авто

 

прикладного программного обеспечения для микроконтроллеров //

 

матизации. 1997. № 2.

 

Компоненты и технологии. 2006. № 11.

2.

Борисов Смирнов А. Операционные системы реального времени для ми

6. http://ru.wikipedia.org/wiki/Список_операционных_систем

 

кроконтроллеров // Chip news. 2008. № 5.

7.

http://www.freertos.org

3.

Сорокин С. Системы реального времени // Современные технологии авто

8.

http://www.freertos.org/index.html? http://www.freertos.org/a00114.html

 

матизации. 1997. № 2.

9.

http://sourceforge.net/projects/freertos/files/FreeRTOS/

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011

 

микроконтроллеры

компоненты

109

Продолжение. Начало в № 2`2011

FreeRTOS —

 

 

 

 

 

 

операционная система

 

 

для микроконтроллеров

 

 

Впредыдущейчастистатьи[1]читательпознакомилсясоперационнойсисте-

 

мойреальноговремени(ОСРВ)длямикроконтроллеров(МК)FreeRTOS. Были

 

изложены достоинства и недостатки использования ОСРВ в основе про-

 

граммного обеспечения микроконтроллерных устройств. Произведена

 

оценка FreeRTOS с точки зрения потребления памяти и дополнительных за-

 

трат процессорного времени. В сокращенном виде была описана структура

 

дистрибутива FreeRTOS и назначение отдельных файлов, входящих в дис-

 

трибутив. Во второй части статьи будут затронуты как основы теории работы

 

ОСРВ в целом, так и продолжено изучение конкретной реализации ОСРВ

 

дляМК —FreeRTOS. Уделеноособоевниманиезадачамкакбазовойединице

Андрей Курниц

программыдляFreeRTOS. ПриведенпримерпростейшейпрограммыдляМК

kurnits@stim.by

AVR ATmega128, работающей под управлением FreeRTOS.

 

Основы работы ОСРВ

выполнение трех задач. В реальном же про-

одна задача. Говорят, что она находится

 

цессоре при работе ОСРВ выполнение задач

в состоянии выполнения. Остальные зада-

Прежде чем говорить об особенностях

носит периодический характер: каждая за-

чи в этот момент не выполняются, ожидая,

FreeRTOS, следует остановиться на основных

дача выполняется определенное время, после

когда планировщик выделит каждой из них

принципах работы любой ОСРВ и пояснить

чего процессор «переключается» на следую-

процессорное время. Таким образом, задача

значение терминов, которые будут приме-

щую задачу (рис. 2).

может находиться в двух основных состоя-

няться в дальнейшем. Эта часть статьи будет

Планировщик (Scheduler) — это часть ядра

ниях: выполняться и не выполняться.

 

особенно полезна читателям, которые не зна-

ОСРВ, которая определяет, какая из задач, го-

Кроме того, что выполнение задачи может

комы с принципами, заложенными в ОСРВ.

товых к выполнению, выполняется в данный

быть приостановлено планировщиком при-

Основой ОСРВ является ядро (Kernel) опе-

конкретный момент времени. Планировщик

нудительно, задача может сама приостано-

рационной системы. Ядро реализует осново-

может приостанавливать, а затем снова воз-

вить свое выполнение. Это происходит в двух

полагающие функции любой ОС. В ОС об-

обновлять выполнение задачи в течение всего

случаях. Первый — это когда задача «хочет»

щего назначения, таких как Windows и Linux,

ее жизненного цикла (то есть с момента соз-

задержать свое выполнение на определенный

ядро позволяет нескольким пользователям

дания задачи до момента ее уничтожения).

промежутоквремени(втакомслучаеонапере-

выполнять множество программ на одном

Алгоритм работы планировщика

ходит в состояние сна (sleep)). Второй — когда

компьютере одновременно.

(Scheduling policy) — это алгоритм, по ко-

задача ожидает освобождения какого-либо

Каждая выполняющаяся программа пред-

торому функционирует планировщик для

аппаратного ресурса (например, последова-

ставляетсобойзадачу(Task).ЕслиОСпозволя-

принятия решения, какую задачу выполнять

тельного порта) или наступления какого-то

ет одновременно выполнять множество задач,

в данный момент времени. Алгоритм работы

события (event), в этом случае говорят, что за-

она является мультизадачной (Multitasking).

планировщика в ОС общего назначения за-

дача блокирована (block). Блокированная или

Большинство процессоров могут выпол-

ключается в предоставлении каждой задаче

«спящая» задача не нуждается в процессорном

нять только одну задачу в один момент вре-

процессорного времени в равной пропорции.

времени до наступления соответствующего

мени. Однако при помощи быстрого пере-

Алгоритм работы планировщика в ОСРВ от-

события или истечения определенного интер-

ключения между задачами достигается эф-

личается и будет описан ниже.

вала времени. Функции измерения интерва-

фект параллельного выполнения всех задач.

Среди всех задач в системе в один мо-

лов времени и обслуживания событий берет

На рис. 1 показано истинно параллельное

мент времени может выполняться только

на себя ядро ОСРВ.

 

Рис. 1. Истинно параллельное выполнение задач

Рис. 2. Распределение процессорного времени между несколькими задачами в ОСРВ

 

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011

www.kit e.ru

110

компоненты

микроконтроллеры

 

 

 

 

в течение которого планировщик не вмеши-

 

 

 

вается в выполнение задачи. По истечении

 

 

 

кванта времени планировщик получает воз-

 

 

 

можность приостановить текущую задачу

 

 

 

и возобновить следующую, готовую к вы-

 

 

 

полнению. Далее квант времени работы

 

 

 

планировщика будет называться систем-

 

 

 

ным квантом. Для отсчета системных кван-

 

 

 

тов в МК обычно используется прерывание

 

 

 

от таймера/счетчика. Системный квант ис-

 

 

 

пользуется как единица измерения интерва-

 

Рис. 3. Переключение между задачами, которые используют один и тот же аппаратный ресурс

лов времени средствами ОСРВ.

 

Уменьшая продолжительность системного

 

 

 

 

 

 

кванта, можно добиться более быстрой реак-

 

Пример перехода задачи в блокированное

ет задачу 2 и восстанавливает задачу 3 (6).

ции программы на внешние события, однако

состояние показан на рис. 3.

Задача 3 пытается получить доступ к тому же

это приведет к увеличению частоты вызова

 

Задача 1 исполняется на протяжении

самому аппаратному ресурсу, который занят

планировщика, что скажется на производи-

определенного времени (1). В момент вре-

задачей 2. В результате чего задача 3 блокиру-

тельности вычислительной системы в целом.

мени (2) планировщик приостанавливает

ется — момент времени (7). Через некоторое

Подводя итог, можно выделить три основ-

задачу 1 и возобновляет выполнение зада-

время управление снова получает задача 2,

ные функции ядра любой ОСРВ:

чи 2 (момент времени (3)). Во время свое-

которая завершает работу с аппаратным ре-

1. Работа планировщика, благодаря которой

го выполнения (4) задача 2 захватывает

сурсом и освобождает его (9). Когда управле-

создается эффект параллельного выпол-

определенный аппаратный ресурс для свое-

ние получает задача 3, она обнаруживает, что

нения нескольких задач за счет быстрого

го единоличного использования. В момент

аппаратный ресурс свободен, захватывает его

переключения между ними.

времени (5) планировщик приостанавлива-

и выполняется до того момента, пока не бу-

2. Переключение контекста, благодаря кото-

 

 

дет приостановлена планировщиком (10).

рому выполнение одной задачи не сказы-

 

 

Когда задача выполняется, она, как и любая

вается на остальных задачах (задачи рабо-

 

 

программа, использует регистры процессора,

тают независимо).

 

 

память программ и память данных. Вместе эти

3. Временная база, основанная на системном

 

 

ресурсы (регистры, стек и др.) образуют кон-

кванте как единице измерения времени.

 

 

текст задачи (task execution context). Контекст

Вышеприведенное описание основ ОСРВ

 

 

задачи целиком и полностью описывает теку-

является очень обобщенным. Существует

 

 

щее состояние процессора: флаги процессора,

еще целый ряд понятий, таких как приорите-

 

 

какая инструкция сейчас выполняется, какие

ты задач, средства синхронизации, передача

 

 

значения загружены в регистры процессора,

информации между задачами и др., которые

 

 

где в памяти находится вершина стека и т. д.

будет раскрыты позже на примере конкрет-

 

 

Задача «не знает», когда ядро ОСРВ прио-

ной ОСРВ — FreeRTOS.

 

 

становит ее выполнение или, наоборот, воз-

Соглашения о типах данных

 

 

обновит.

 

 

На рис. 4а показан абстрактный процессор,

и именах идентификаторов

 

 

который выполняет задачу 1, частью которой

Как упоминалось в [1], бóльшая (подавляю-

 

 

является операция сложения. Операнды за-

 

 

гружены в регистры Reg1 и Reg2 (инструкции

щая) часть FreeRTOS написана на языке Си.

 

 

LDI). Пусть перед инструкцией сложения

Имена идентификаторов в исходном коде

 

 

ADD ядро приостановило задачу 1 и отдало

ядра и демонстрационных проектах подчиня-

 

 

управление задаче 2, которая использует ре-

ются определенным соглашениям, зная кото-

 

 

гистры Reg1 и Reg2 для своих нужд (рис. 4б).

рые проще понимать тексты программ [5].

 

 

В какой-то момент времени ядро возобновит

Имена переменных и функций представ-

 

 

выполнение задачи 1 с места, где она была

лены в префиксной форме (так называемая

 

 

приостановлена: с инструкции ADD (рис. 4в).

Венгерская нотация): имена начинаются

 

 

Однако для задачи 1 изменение ее контекста

с одной или нескольких строчных букв —

 

 

(регистров Reg1 и Reg2) останется незамечен-

префикса.

 

 

ным, произойдет сложение, но его результат

Для переменных префикс определяет тип

 

 

«с точки зрения» задачи 1 окажется неверным.

переменной согласно таблице 1.

 

 

Таким образом, одна из основных функ-

Например, ulMemCheck — переменная

 

 

ций ядра ОСРВ — это обеспечение идентич-

типа unsigned long, pxCreatedTask — пере-

 

 

ности контекста задачи до ее приостановки

менная типа «указатель на структуру».

 

 

и после ее восстановления. Когда ядро при-

API-функции FreeRTOS имеют префиксы,

 

 

останавливает задачу, оно должно сохранить

обозначающие тип возвращаемого значения,

 

 

контекст задачи, а при ее восстановлении —

как и для переменных. Системные функции,

 

 

восстановить. Процесс сохранения и восста-

область видимости которых ограничена фай-

 

 

новления контекста задачи называется пере-

лом исходного кода ядра (то есть имеющие

 

 

ключением контекста (context switching).

спецификатор static), имеют префикс prv.

 

Рис. 4. Переключение между задачами

Немаловажным понятием является квант

Следом за префиксом функции следу-

 

времени работы планировщика (tick) — это

ет имя модуля (файла с исходным кодом),

 

без переключения контекста

 

 

жестко фиксированный отрезок времени,

в котором она определена. Например,

 

 

 

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011

 

 

 

 

 

микроконтроллеры

компоненты

111

Таблица 1. Префиксы переменных

2. portBASE_TYPE определяет тип, актив-

ет» об активности планировщика, то он отве-

но используемый в коде ядра FreeRTOS.

чает за переключение контекста при смене вы-

Префикс

 

Ее тип

Операции с типом portBASE должны вы-

полняющейся задачи. Для достижения этого

переменной

 

полняться как можно более эффективно

каждая задача имеет свой собственный стек.

 

 

c

 

char

 

на данном МК, поэтому разрядность типа

При смене задачи ее контекст сохраняется в ее

s

 

short

 

portBASE_TYPE устанавливается идентич-

собственном стеке, что позволяет восстано-

l

 

long

 

ной разрядности целевого МК. Например,

вить контекст при возобновлении задачи [4].

f

 

float

d

 

double

для 8 битных МК это будет char, для

Как было сказано выше, при грубом при-

v

 

void

16 битных — short.

 

ближении задача может находиться в двух со-

e

 

Перечисляемый тип (enum)

 

 

Идентификаторы макроопределений так-

стояниях:выполнятьсяиневыполняться.При

x

 

Структуры (struct) и др. типы

p

Указатель (дополнительно к вышеперечисленным)

же начинаются с префикса, который опреде-

подробном рассмотрении состояние «задача

u

Беззнаковый (дополнительно к вышеперечисленным)

ляет, в каком файле этот макрос находится

не выполняется» подразделяется на несколько

 

 

 

 

 

 

(табл. 3).

 

 

различных состояний в зависимости от того,

vTaskStartScheduler() — функция, возвра-

 

 

 

как она была остановлена (рис. 5).

 

щающая тип void, которая определена в фай-

Таблица 3. Префиксы макросов,

Подробно рассмотрим состояния зада-

ле task.c, uxQueueMessagesWaiting() — воз-

чи в FreeRTOS. Говорят, что задача выпол-

используемых в FreeRTOS

 

вращает некий беззнаковый целочисленный

 

 

 

няется (running), если в данный момент

тип, определена в файле queue. c.

Префикс

Где определен

Пример макроопределения

времени процессор занят ее выполнением.

Встроенные типы данных (short, char и т. д.)

port

portable.h

portMAX_DELAY

Состояние готовности (ready) характеризу-

не используются в исходном коде ядра. Вместо

tsk, task

task.h

taskENTER_CRITICAL()

ет задачу, готовую к выполнению, но не вы-

этого используется набор специальных типов,

pd

projdefs.h

pdTRUE

полняющуюся, так как в данный момент вре-

которые определены индивидуально для каж-

config

FreeRTOSConfig.h

configUSE_PREEMPTION

мени процессор занят выполнением другой

дого порта в файле portmacro.h и начинаются

err

projdefs.h

errQUEUE_FULL

задачи. Готовые к выполнению задачи (с оди-

 

 

 

с префикса port. Список специальных типов

Задачи

 

 

наковым приоритетом) по очереди переходят

FreeRTOS приведен в таблице 2.

 

 

в состояние выполнения и пребывают в нем

 

 

 

 

 

 

в течение одного системного кванта, после

Таблица 2. Специальные типы FreeRTOS

Любая программа, которая выполняется

чего возвращаются в состояние готовности.

 

под управлением FreeRTOS, представляет со-

Задача находится в блокированном состоя-

 

 

 

Специальный тип

Соответствующий встроенный тип

бой множество отдельных независимых задач.

нии, если она ожидает наступления временно-

FreeRTOS

 

 

Каждая задача выполняется в своем собствен-

го или внешнего события (event). Например,

portCHAR

 

char

 

ном контексте без случайных зависимостей

вызвав API-функцию vTaskDelay(), задача

portSHORT

 

short

 

от других задач и ядра FreeRTOS. Только одна

переведет себя в блокированное состояние

portLONG

 

long

portTickType

Тип счетчика системных квантов

задача из множества может выполняться

до тех пор, пока не пройдет временной период

portBASE_TYPE Наиболее употребительный тип во FreeRTOS

в один момент времени, и планировщик от-

задержки (delay): это будет временное событие.

 

 

 

 

 

 

ветственен, какая именно. Планировщик оста-

Задача блокирована, если она ожидает собы-

Это сделано для обеспечения независимо-

навливает и возобновляет выполнение всех

тия, связанного с другими объектами ядра —

сти кода ядра от конкретных компилятора

задач по очереди, чтобы достичь эффекта од-

очередями и семафорами: это будет внешнее

и МК. В демонстрационных проектах так же

новременного выполнения нескольких задач

(по отношению к задаче) событие. Нахождение

использованы только специальные типы

на одном процессоре. Так как задача «не зна-

задачи в блокированном состоянии ограниче-

FreeRTOS, однако в своих проектах можно

 

 

 

 

 

использовать встроенные типы данных. Это

 

 

 

 

 

окажется полезным для разграничения иден-

 

 

 

 

 

тификаторов, относящихся к ядру FreeRTOS,

 

 

 

 

 

от идентификаторов, использующихся

 

 

 

 

 

в прикладных задачах. Напротив, исполь-

 

 

 

 

 

зование типов данных FreeRTOS позволит

 

 

 

 

 

добиться большей кроссплатформенности

 

 

 

 

 

создаваемого кода.

 

 

 

 

 

Подробнее следует остановиться на типах

 

 

 

 

 

portTickType и portBASE_TYPE:

 

 

 

 

 

1. portTickType может быть целым беззна-

 

 

 

 

 

ковым 16 или 32 битным. Он определяет

 

 

 

 

 

тип системной переменной, которая ис-

 

 

 

 

 

пользуется для подсчета количества си-

 

 

 

 

 

стемных квантов, прошедших с момента

 

 

 

 

 

старта планировщика. Таким образом,

 

 

 

 

 

portTickType задает максимальный вре-

 

 

 

 

 

менной интервал, который может быть

 

 

 

 

 

отсчитан средствами FreeRTOS. В случае

 

 

 

 

 

16 битного portTickType максимальный

 

 

 

 

 

интервал составляет 65 536 квантов, в слу-

 

 

 

 

 

чае 32 битного — 4 294 967 296 квантов.

 

 

 

 

 

Использование 16 битного счетчика кван-

 

 

 

 

 

тов оправдано на 8 и 16 битных платфор-

 

 

 

 

 

мах, так как позволяет значительно повы-

Рис. 5. Состояния задачи в FreeRTOS

 

 

сить их быстродействие.

 

 

 

 

 

 

 

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011

www.kit e.ru

112

 

компоненты

 

микроконтроллеры

 

 

 

 

 

 

 

 

 

 

 

 

но тайм-аутом. То есть если ожидаемое внешнее событие не наступило в течение тайм-аута, то задача возвращается в состояние готовности к выполнению. Это предотвращает «подвисание» задачи при ожидании внешнего события, которое по каким-то причинам никогда не наступит. Блокированная задача не получает процессорного времени.

Приостановленная (suspended) задача также не получает процессорного времени, однако, в отличие от блокированного состояния, переход в приостановленное состояние

ивыход из него осуществляется в явном виде вызовом API-функций vTaskSuspend()

иxTaskResume(). Тайм-аут для приостановленного состояния не предусмотрен, и задача может оставаться приостановленной сколь угодно долго [5].

Влюбой программе реального времени есть как менее, так и более ответственные задачи. Под «ответственностью» задачи здесь понимается время реакции программы на внешнее событие, которое обрабатывается задачей. Например, ко времени реакции на срабатывание датчика в производственной установке предъявляются куда более строгие требования, чем ко времени реакции на нажатие клавиши на клавиатуре. Для обеспечения преимущества на выполнение более ответственных задач во FreeRTOS применяется механизм приоритетов задач (Task priorities).

Среди всех задач, находящихся в состоянии готовности, планировщик отдаст управление той задаче, которая имеет наивысший приоритет. Задача будет выполняться до тех пор, пока она не будет блокирована или приостановлена или пока не появится готовая к выполнению задача с более высоким приоритетом.

Каждой задаче назначается приоритет от 0

до (configMAX_PRIORITIES — 1). Меньшее значение приоритета соответствует меньшему приоритету. Наиболее низкий приоритет у задачи «бездействие», значение которого определено в tskIDLE_PRIORITY как 0. Изменяя зна-

чение configMAX_PRIORITIES, можно опре-

делить любое число возможных приоритетов,

однако уменьшение configMAX_PRIORITIES

позволяет уменьшить объем ОЗУ, потребляемый ядром.

Задачи в FreeRTOS реализуются в виде Сифункций. Обязательное требование к функции, реализующей задачу: она должна иметь один аргумент типа указатель на void и ничего не возвращать (void). Указатель на такую функцию определен как pdTASK_CODE. Каждая задача — это небольшая программа со своей точкой входа, которая содержит бесконечный цикл:

void ATaskFunction( void *pvParameters )

{

/* Переменные могут быть объявлены здесь, как и в обычной функции. Каждый экземпляр этой задачи будет иметь свою собственную копию переменной iVariableExample. Если объявить переменную со спецификатором static, то будет создана только одна переменная iVariableExample, доступная из всех экземпляров задачи */

int iVariableExample = 0;

/* Тело задачи реализовано как бесконечный цикл */

for( ;; )

{

/* Код, реализующий функциональность задачи */

}

/* Если все-таки произойдет выход из бесконечного цикла, то задача должна быть уничтожена ДО конца функции. Параметр NULL обозначает, что уничтожается задача,

вызывающая API-функцию vTaskDelete() */ vTaskDelete( NULL );

}

Задачи создаются API-функцией xTaskCreate(), а уничтожаются xTaskDelete().

Функция xTaskCreate() является одной из наиболее сложных API-функций. Ее прототип:

portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth,

void *pvParameters,

unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask

);

xTaskCreate() в случае успешного создания задачи возвращает pdTRUE. Если же объема памяти кучи недостаточно для размещения служебных структур данных и стека задачи, то xTaskCreate() возвращает errCOULD_NOT_ALLOCATE_REQUIRED_ MEMORY. Функции xTaskCreate() передают-

ся следующие аргументы:

1.pvTaskCode — указатель на функцию, реализующую задачу (фактически — идентификатор функции в программе).

2.pcName — нуль-терминальная (заканчивающаяся нулем) cтрока, определяющая имя функции. Ядром не используется, а служит лишь для наглядности при отладке.

3.usStackDepth — глубина (размер) собственного стека создаваемой задачи. Размер задается в словах, хранящихся в стеке, а не в байтах. Например, если стек хранит 32 битные слова, а значение usStackDepth задано равным 100, то для размещения стека задачи будет выделено 4 100 = 400 байт. Размер стека в байтах не должен превышать максимального значения для типа size_t. Размер стека, необходимый для корректной работы задачи, которая ничего не делает (содержит только пустой бесконечный цикл, как задача ATaskFunction выше), задается макро-

сом configMINIMAL_STACK_SIZE. Не ре-

комендуется создавать задачи с меньшим размером стека. Если же задача потребляет большие объемы стека, то необходимо задать большее значение usStackDepth. Нет простого способа определить размер стека, необходимого задаче. Хотя возможен точный расчет, большинство программистов находят золотую середину между требованиями выделения достаточного размера стека и эффективного расхода памяти. Существуют встроенные механизмы экспериментальной оценки объема используемого стека, например API-функция uxTaskGetStackHighWaterMark(). О воз-

можностях контроля переполнения стека будет рассказано позже.

4.pvParameters — произвольный параметр, передаваемый задаче при ее создании. Задается в виде указателя на void, в теле задачи может быть преобразован в указатель на любой другой тип. Передача параметра оказывается полезной возможностью при создании нескольких экземпляров одной задачи.

5.uxPriority — определяет приоритет создаваемой задачи. Нуль соответствует самому низкому приоритету, (configMAX_ PRIORITIES — 1) — наивысшему.

Значение аргумента uxPriority большее,

чем (configMAX_PRIORITIES — 1), при-

ведет к назначению задаче приоритета

(configMAX_PRIORITIES — 1).

6.pxCreatedTask — может использоваться для получения дескриптора (handle) создаваемой задачи, который помещается по адресу pxCreatedTask после успешного создания задачи. Дескриптор можно использовать

вдальнейшем для различных операций над задачей, например изменения приоритета задачи или ее уничтожения. Если в получении дескриптора нет необходимости, то pxCreatedTask должен быть установлен

вNULL.

По сложившейся традиции первая программа в учебнике по любому языку программирования для компьютеров выводит на экран монитора фразу “Hello, world!”. Рискнем предположить, что для микроконтроллеров первая программа должна переключать логический уровень на своих выводах с некоторой частотой (проще говоря, мигать светодиодами).

Что ж, пришло время написать первую программу под управлением FreeRTOS. Программа будет содержать две задачи. Задача 1 будет переключать логический уровень на одном выводе МК, задача 2 — на другом. Частота переключения для разных выводов будет разной.

В качестве аппаратной платформы будет использоваться МК AVR ATmega128L, установленный на мезонинный модуль

WIZ200WEB фирмы WIZnet (рис. 6) [7]. Как отправная точка будет взят демонстрационный проект, компилятор — WinAVR, версия

2010.01.10.

Прежде всего необходимо загрузить и установить компилятор WinAVR [8]. Далее с официального сайта [9] загрузить дистрибутив FreeRTOS и распаковать в удобное место (в статье это C:/).

Демонстрационный проект распола-

гается в C:/FreeRTOSV6.1.0/Demo/AVR_ ATMega323_WinAVR/ и предназначен для выполнения на МК ATmega323. Файл makefile, находящийся в директории проекта, содержит все настройки и правила компиляции и, в том числе, определяет, для какого МК компилируется проект. Для того чтобы целевой платформой стал МК ATmega128, необходимо в файле makefile отыскать строку:

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011

 

 

 

микроконтроллеры

 

компоненты

 

113

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 6. Мезонинный модуль WIZ200WEB

MCU = atmega323

и заменить ее на

MCU = atmega128

Для редактирования файлов можно применить простой, но удобный тексто-

вый редактор Programmers Notepad, кото-

рый поставляется вместе с компилятором WinAVR (рис. 7), запустить который мож-

но выполнив Пуск Все программы

WinAVR-20100110 Programmers Notepad [WinAVR]илиC:/WinAVR-20100110/pn/pn.exe

(в случае установки WinAVR на диск C:/).

Помимо прочего Programmers Notepad по-

зволяет производить сборку (buid) проекта прямо из окна редактора.

Далеенеобходимоисключитьизкомпиляции большинство исходных файлов проекта, отвечающих за демонстрацию всех возможностей FreeRTOS, оставив лишь основной файл main.c. То есть заменить фрагмент файла makefile:

SRC = \ main.c \

ParTest/ParTest.c \ serial/serial.c \ regtest.c \

$(SOURCE_DIR)/tasks.c \ $(SOURCE_DIR)/queue.c \ $(SOURCE_DIR)/list.c \ $(SOURCE_DIR)/croutine.c \ $(SOURCE_DIR)/portable/MemMang/heap_1.c \ $(PORT_DIR)/port.c \

$(DEMO_DIR)/crflash.c \ $(DEMO_DIR)/integer.c \ $(DEMO_DIR)/PollQ.c \ $(DEMO_DIR)/comtest.c

на:

SRC = \ main.c \

$(SOURCE_DIR)/tasks.c \ $(SOURCE_DIR)/queue.c \ $(SOURCE_DIR)/list.c \ $(SOURCE_DIR)/croutine.c \ $(SOURCE_DIR)/portable/MemMang/heap_1.c \ $(PORT_DIR)/port.c

Рис. 7. Окно редактора Programmers Notepad

Подготовительный этап закончен. Теперь можно переходить к редактированию файла main. c. Его содержимое должно принять вид:

#include <stdlib.h> #include <string.h>

#ifdef GCC_MEGA_AVR

/* EEPROM routines used only with the WinAVR compiler. */ #include <avr/eeprom.h>

#endif

/* Необходимые файлы ядра */ #include “FreeRTOS.h” #include “task.h”

#include “croutine.h”

/*-----------------------------------------------------------

*/

/* Функция задачи 1 */

 

void vTask1( void *pvParameters )

 

{

 

/* Квалификатор volatile запрещает оптимизацию /* переменной ul */

volatile unsigned long ul;

/* Как и большинство задач, эта задача содержит /* бесконечный цикл */

for( ;; )

{

/* Инвертировать бит 0 порта PORTF */ PORTF ^= (1 << PF0);

/* Задержка на некоторый период Т1*/ for( ul = 0; ul < 4000L; ul++ )

{

/* Это очень примитивная реализация задержки, /* в дальнейших примерах будут использоваться

/* API-функции */

}

}

/* Уничтожить задачу, если произошел выход /* из бесконечного цикла (в данной реализации выход /* заведомо не произойдет) */

vTaskDelete( NULL );

}

 

/*-----------------------------------------------------------

*/

/* Функция задачи 2, подобная задаче 1 */

 

void vTask2( void *pvParameters )

 

{

 

volatile unsigned long ul;

 

for( ;; )

 

{

 

/* Инвертировать бит 1 порта PORTF */

 

PORTF ^= (1 << PF1);

 

/* Задержка на некоторый период Т2*/

 

for( ul = 0; ul < 8000L; ul++ )

 

{

 

}

 

}

 

vTaskDelete( NULL );

 

}

 

/*-----------------------------------------------------------

*/

short main( void )

{

/* Биты 0, 1 порта PORTF будут работать как ВЫХОДЫ */ DDRF |= (1 << DDF0) | (1 << DDF1);

/* Создать задачу 1, заметьте, что реальная программа должна /* проверять возвращаемое значение, чтобы убедиться, /* что задача создана успешно */

xTaskCreate(vTask1, /* Указатель на функцию,

 

/* реализующую задачу */

(signed char *) “Task1”, /* Текстовое имя задачи.

 

/* Только для наглядности */

configMINIMAL_STACK_SIZE, /* Размер стека –

 

/* минимально необходимый*/

NULL,

/* Параметр, передаваемый задаче, –

 

/* не используется */

1,

/* Приоритет = 1 */

NULL );

/*Получениедескрипторазадачи–неиспользуется*/

/* Создать задачу 2 */

xTaskCreate( vTask2, ( signed char * ) “Task2”, configMINIMAL_STACK_SIZE, NULL, 1, NULL );

 

/* Запустить планировщик. Задачи начнут выполняться. */

 

vTaskStartScheduler();

 

return 0;

}

 

/*

-----------------------------------------------------------*/

Для сборки проекта из среды Programmers Notepad необходимо выбрать пункт меню

Tools [WinAVR] Make all (рис. 8).

Сообщение об отсутствии ошибок (Errors: none) означает успешную сборку и получение файла прошивки rtosdemo.hex, который должен появиться в директории проекта.

Используя любой программатор, необходимо загрузить файл прошивки в целевой МК. Автор использовал для этой цели аналог отладчика JTAG ICE (рис. 9). Возможна загрузка и через интерфейс SPI.

Подключив осциллограф к выводам 1, 2 разъема J2 — они подключены к выводам PF0 и PF1 ATmega128 соответственно (обозначены красным на рис. 9), можно наблюдать совместную работу двух независимых задач (рис. 10).

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

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011

www.kit e.ru

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]