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

Страница создана Бахыт Давыдов
 
ПРОДОЛЖИТЬ ЧТЕНИЕ
FreeRTOS - операционная система - для микроконтроллеров
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
FreeRTOS - операционная система - для микроконтроллеров
микроконтроллеры   компоненты                                  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) в процес‑
расходам. Это:                                                                                              сорах Cortex-M3.
1. Дополнительный расход памяти программ                Обзор FreeRTOS                                  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
FreeRTOS - операционная система - для микроконтроллеров
98                                         компоненты                   микроконтроллеры

                                                                                                                                              тетной задаче, что позволяет значительно со‑
      Таблица 1. Список официальных портов FreeRTOS и средств разработки                                                                      кратить время реакции системы на прерыва‑
          Производитель                          Поддерживаемые семейства (ядра)                    Поддерживаемые средства разработки
                                                                                                                                              ние, связанное с внешним событием.
                Altera                                           Nios II                                        Nios II IDE, GCC
                                                                                                                                                Для оценки затрат времени, вносимых
                                                           SAM3 (Cortex-M3)                                                                   планировщиком FreeRTOS, можно срав‑
                                                             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                                                                        процессора) сохраняется/извлекается из сте‑
                                                           PPC405 & PPC440                                                                    ка (таблица 2). Замеры приведены для ком‑
               Fujitsu
                                                      32 бит (например, MB91460)
                                                                                                                    Softune                   пиляторов MPLAB PIC18 compiler и WinAVR
                                                   16 бит (например, MB96340 16FX)
          Luminary Micro /                                                                           Keil, IAR, Code Red, CodeSourcery GCC,
                                                                                                                                              соответственно, уровень оптимизации —
                                               Все МК Stellaris на основе ядра Cortex-M3
          Texas Instruments                                                                                     Rowley CrossWorks             максимальный по скорости.
                                                               PIC32                                                                            Для того чтобы оценить объем ОЗУ, тре‑
                                                               PIC24                                       MPLAB C32, MPLAB C30,
              Microchip
                                                               dsPIC                                          MPLAB C18, wizC
                                                               PIC18                                                                            Таблица 2. Расход времени на переключение
                                                            V850 (32 бит)                                                                       между задачами
                NEC                                                                                                   IAR
                                                           78K0R (16 бит)
                                                        LPC1700 (Cortex-M3)                          GCC, Rowley CrossWorks, IAR, Keil, Red

                                                                                                                                                                                                                          Время сохранения/
                                                                                                                                                                               тактирования, МГц
                NXP

                                                                                                                                                    Микроконтроллер
                                                                                                                 Suite, Eclipse

                                                                                                                                                                                                                            восстановления
                                                          LPC2000 (ARM7)

                                                                                                                                                                                                   контекста, мкс

                                                                                                                                                                                                                             контекста, мкс
                                                                                                                                                                                                   переключения
                                                           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
                                                            STR9 (ARM9)                                                                         PIC18F452                           20                66,2                    ~10
          Texas Instruments                                   MSP430                                     Rowley CrossWorks, IAR, GCC
                                               PPC405, выполняющийся на Virtex4 FPGA
                Xilinx                         PPC440, выполняющийся на Virtex5 FPGA                                 GCC
                                                                                                                                              буемый для работы FreeRTOS, достаточно
                                                             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 + стек задачи
                                                                                                                                                          (task)
 1 мс.                                                                     задачи. Особенно полезен этот режим, ког‑
   Если готовы к выполнению несколько за‑                                  да необходимо сократить время реакции си‑
 дач с одинаковым приоритетом, то в таком                                  стемы на прерывание. Допустим, в текущий                           работе FreeRTOS на 8‑ и 16‑битных архитек‑
 случае планировщик выделяет каждой из них                                 момент выполняется низкоприоритетная за‑                           турах.
 по одному кванту времени, по истечении                                    дача, а высокоприоритетная ожидает насту‑                             Кроме самой FreeRTOS, существуют
 которого управление получает следующая                                    пления некоторого прерывания. Далее про‑                           также ее коммерческие версии: SafeRTOS
 задача с таким же приоритетом, и так далее                                исходит прерывание, но по окончании ра‑                            и OpenRTOS. SafeRTOS — это ОСРВ, соот‑
 по кругу.                                                                 боты обработчика прерываний выполнение                             ветствующая уровню функциональной без‑
   Кооперативная многозадачность отлича‑                                   возвращается к текущей низкоприоритетной                           опасности SIL3, имеющая такую же функ‑
 ется от вытесняющей тем, что планировщик                                  задаче, а высокоприоритетная ожидает, пока                         циональную модель, что и FreeRTOS, и ори‑
 самостоятельно не может прервать выполне‑                                 закончится текущий квант времени. Однако                           ентированная на применение в системах
 ние текущей задачи, даже если появилась го‑                               если после выполнения обработчика преры‑                           с высокими требованиями к безопасности,
 товая к выполнению задача с более высоким                                 вания передать управление планировщику,                            например в медицинской и аэрокосмической
 приоритетом. Каждая задача должна само‑                                   то он передаст управление высокоприори‑                            отраслях. OpenRTOS отличается от FreeRTOS

                                                                                                                                                                      КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 2 '2011
FreeRTOS - операционная система - для микроконтроллеров
микроконтроллеры     компоненты                                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 — содержит макросы для             FreeRTOSConf ig.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
FreeRTOS - операционная система - для микроконтроллеров
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
FreeRTOS - операционная система - для микроконтроллеров
микроконтроллеры        компоненты                                           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
FreeRTOS - операционная система - для микроконтроллеров
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
FreeRTOS - операционная система - для микроконтроллеров
микроконтроллеры     компоненты                                  111

                                                               2. portBASE_TYPE определяет тип, актив-                   ет» об активности планировщика, то он отве-
  Таблица 1. Префиксы переменных                                  но используемый в коде ядра FreeRTOS.                  чает за переключение контекста при смене вы-
 Префикс                                                          Операции с типом portBASE должны вы-                   полняющейся задачи. Для достижения этого
                                 Ее тип
переменной                                                        полняться как можно более эффективно                   каждая задача имеет свой собственный стек.
     c                              char
                                                                  на данном МК, поэтому разрядность типа                 При смене задачи ее контекст сохраняется в ее
     s                             short
     l                              long                          portBASE_TYPE устанавливается идентич-                 собственном стеке, что позволяет восстано-
     f                             float                          ной разрядности целевого МК. Например,                 вить контекст при возобновлении задачи [4].
     d                            double                          для 8‑битных МК это будет char, для                       Как было сказано выше, при грубом при-
     v                             void
     e                   Перечисляемый тип (enum)
                                                                  16‑битных — short.                                     ближении задача может находиться в двух со-
     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     мени процессор занят выполнением другой
                                                                  err          projdefs.h           errQUEUE_FULL
дого порта в файле portmacro.h и начинаются                                                                              задачи. Готовые к выполнению задачи (с оди-
с префикса port. Список специальных типов                                                                                наковым приоритетом) по очереди переходят
FreeRTOS приведен в таблице 2.                                 Задачи                                                    в состояние выполнения и пребывают в нем
                                                                                                                         в течение одного системного кванта, после
  Таблица 2. Специальные типы FreeRTOS                           Любая программа, которая выполняется                    чего возвращаются в состояние готовности.
                                                               под управлением FreeRTOS, представляет со-                   Задача находится в блокированном состоя-
 Специальный тип
    FreeRTOS           Соответствующий встроенный тип          бой множество отдельных независимых задач.                нии, если она ожидает наступления временно-
                                                               Каждая задача выполняется в своем собствен-               го или внешнего события (event). Например,
      portCHAR                         char
     portSHORT                        short
                                                               ном контексте без случайных зависимостей                  вызвав API-функцию vTaskDelay(), задача
     portLONG                          long                    от других задач и ядра FreeRTOS. Только одна              переведет себя в блокированное состояние
    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
FreeRTOS - операционная система - для микроконтроллеров
112                                     компоненты                 микроконтроллеры

  но тайм-аутом. То есть если ожидаемое внеш-                          for( ;; )
                                                                                                                                  4. pvParameters — произвольный параметр,
  нее событие не наступило в течение тайм-аута,                        {                                                             передаваемый задаче при ее создании.
                                                                     		 /* Код, реализующий функциональность задачи */
  то задача возвращается в состояние готовности                        }
                                                                                                                                     Задается в виде указателя на void, в теле за-
  к выполнению. Это предотвращает «подвиса-                            /* Если все-таки произойдет выход из бесконечного цикла,      дачи может быть преобразован в указатель
                                                                       то задача должна быть уничтожена ДО конца функции.
  ние» задачи при ожидании внешнего события,                           Параметр NULL обозначает, что уничтожается задача,
                                                                                                                                     на любой другой тип. Передача параметра
  которое по каким-то причинам никогда не на-                          вызывающая API-функцию vTaskDelete() */                       оказывается полезной возможностью при
                                                                       vTaskDelete( NULL );
  ступит. Блокированная задача не получает про-                      }
                                                                                                                                     создании нескольких экземпляров одной
  цессорного времени.                                                                                                                задачи.
     Приостановленная (suspended) задача так-                                                                                     5. uxPriority — определяет приоритет соз-
  же не получает процессорного времени, од-                           Задачи создаются API-функцией                                  даваемой задачи. Нуль соответствует са-
  нако, в отличие от блокированного состоя-                         xTaskCreate(), а уничтожаются xTaskDelete().                     мому низкому приоритету, (configMAX_
  ния, переход в приостановленное состояние                         Функция xTaskCreate() является одной                             PRIORITIES — 1 ) — н а и в ы с ш е м у .
  и выход из него осуществляется в явном                            из наиболее сложных API-функций. Ее про-                         Значение аргумента uxPriority большее,
  виде вызовом API-функций vTaskSuspend()                           тотип:                                                           чем (configMAX_PRIORITIES — 1), при-
  и xTaskResume(). Тайм-аут для приостанов-                                                                                          ведет к назначению задаче приоритета
                                                                     portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,
  ленного состояния не предусмотрен, и задача                                     const signed portCHAR * const pcName,
                                                                                                                                     (configMAX_PRIORITIES — 1).
  может оставаться приостановленной сколь                                         unsigned portSHORT usStackDepth,                6. pxCreatedTask — может использоваться для
                                                                                  void *pvParameters,
  угодно долго [5].                                                               unsigned portBASE_TYPE uxPriority,
                                                                                                                                     получения дескриптора (handle) создавае-
     В любой программе реального вре-                                             xTaskHandle *pxCreatedTask                         мой задачи, который помещается по адресу
                                                                     );
  мени есть как менее, так и более ответствен-                                                                                       pxCreatedTask после успешного создания
  ные задачи. Под «ответственностью» задачи                                                                                          задачи. Дескриптор можно использовать
  здесь понимается время реакции программы                             xTaskCreate() в случае успешного созда-                       в дальнейшем для различных операций
  на внешнее событие, которое обрабатывает-                         ния задачи возвращает pdTRUE. Если же                            над задачей, например изменения приори-
  ся задачей. Например, ко времени реакции                          объема памяти кучи недостаточно для раз-                         тета задачи или ее уничтожения. Если в по-
  на срабатывание датчика в производственной                        мещения служебных структур данных                                лучении дескриптора нет необходимости,
  установке предъявляются куда более строгие                        и стека задачи, то xTaskCreate() возвращает                      то pxCreatedTask должен быть установлен
  требования, чем ко времени реакции на на-                         errCOULD_NOT_ALLOCATE_REQUIRED_                                  в NULL.
  жатие клавиши на клавиатуре. Для обеспече-                        MEMORY. Функции xTaskCreate() передают-                          По сложившейся традиции первая про-
  ния преимущества на выполнение более от-                          ся следующие аргументы:                                       грамма в учебнике по любому языку про-
  ветственных задач во FreeRTOS применяется                         1. pvTaskCode — указатель на функцию, реа-                    граммирования для компьютеров выводит
  механизм приоритетов задач (Task priorities).                        лизующую задачу (фактически — иденти-                      на экран монитора фразу “Hello, world!”.
     Среди всех задач, находящихся в состоянии                         фикатор функции в программе).                              Рискнем предположить, что для микрокон-
  готовности, планировщик отдаст управление                         2. pcName — нуль-терминальная (заканчива-                     троллеров первая программа должна пере-
  той задаче, которая имеет наивысший приори-                          ющаяся нулем) cтрока, определяющая имя                     ключать логический уровень на своих вы-
  тет. Задача будет выполняться до тех пор, пока                       функции. Ядром не используется, а служит                   водах с некоторой частотой (проще говоря,
  она не будет блокирована или приостановлена                          лишь для наглядности при отладке.                          мигать светодиодами).
  или пока не появится готовая к выполнению                         3. usStackDepth — глубина (размер) собствен-                     Что ж, пришло время написать первую
  задача с более высоким приоритетом.                                  ного стека создаваемой задачи. Размер зада-                программу под управлением FreeRTOS.
     Каждой задаче назначается приоритет от 0                          ется в словах, хранящихся в стеке, а не в бай-             Программа будет содержать две задачи.
  до (configMAX_PRIORITIES — 1). Меньшее                               тах. Например, если стек хранит 32‑битные                  Задача 1 будет переключать логический уро-
  значение приоритета соответствует меньшему                           слова, а значение usStackDepth задано рав-                 вень на одном выводе МК, задача 2 — на дру-
  приоритету. Наиболее низкий приоритет у за-                          ным 100, то для размещения стека задачи                    гом. Частота переключения для разных вы-
  дачи «бездействие», значение которого опреде-                        будет выделено 4100 = 400 байт. Размер                    водов будет разной.
  лено в tskIDLE_PRIORITY как 0. Изменяя зна-                          стека в байтах не должен превышать мак-                       В качестве аппаратной платформы бу-
  чение configMAX_PRIORITIES, можно опре-                              симального значения для типа size_t. Размер                дет использоваться МК AVR ATmega128L,
  делить любое число возможных приоритетов,                            стека, необходимый для корректной работы                   установленный на мезонинный модуль
  однако уменьшение configMAX_PRIORITIES                               задачи, которая ничего не делает (содержит                 WIZ200WEB фирмы WIZnet (рис. 6) [7]. Как
  позволяет уменьшить объем ОЗУ, потребляе-                            только пустой бесконечный цикл, как за-                    отправная точка будет взят демонстрацион-
  мый ядром.                                                           дача ATaskFunction выше), задается макро-                  ный проект, компилятор — WinAVR, версия
     Задачи в FreeRTOS реализуются в виде Си-                          сом configMINIMAL_STACK_SIZE. Не ре-                       2010.01.10.
  функций. Обязательное требование к функ-                             комендуется создавать задачи с меньшим                        Прежде всего необходимо загрузить
  ции, реализующей задачу: она должна иметь                            размером стека. Если же задача потребляет                  и установить компилятор WinAVR [8]. Далее
  один аргумент типа указатель на void и ни-                           большие объемы стека, то необходимо за-                    с официального сайта [9] загрузить дистри-
  чего не возвращать (void). Указатель на та-                          дать большее значение usStackDepth. Нет                    бутив FreeRTOS и распаковать в удобное ме-
  кую функцию определен как pdTASK_CODE.                               простого способа определить размер сте-                    сто (в статье это C:/).
  Каждая задача — это небольшая программа                              ка, необходимого задаче. Хотя возможен                        Демонстрационный проект распола-
  со своей точкой входа, которая содержит бес-                         точный расчет, большинство програм-                        гается в C:/FreeRTOSV6.1.0/Demo/AVR_
  конечный цикл:                                                       мистов находят золотую середину между                      ATMega323_WinAVR/ и предназначен
                                                                       требованиями выделения достаточного                        для выполнения на МК ATmega323. Файл
  void ATaskFunction( void *pvParameters )
       {
                                                                       размера стека и эффективного расхода па-                   makefile, находящийся в директории про-
       /* Переменные могут быть объявлены здесь, как и в обычной       мяти. Существуют встроенные механизмы                      екта, содержит все настройки и правила
       функции. Каждый экземпляр этой задачи будет иметь свою
       собственную копию переменной iVariableExample. Если
                                                                       экспериментальной оценки объема ис-                        компиляции и, в том числе, определяет,
       объявить переменную со спецификатором static, то будет          пользуемого стека, например API-функция                    для какого МК компилируется проект. Для
       создана только одна переменная iVariableExample,
       доступная из всех экземпляров задачи */
                                                                       uxTaskGetStackHighWaterMark(). О воз-                      того чтобы целевой платформой стал МК
       int iVariableExample = 0;                                       можностях контроля переполнения стека                      ATmega128, необходимо в файле makef ile
       /* Тело задачи реализовано как бесконечный цикл */
                                                                       будет рассказано позже.                                    отыскать строку:

                                                                                                                                           КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011
FreeRTOS - операционная система - для микроконтроллеров
микроконтроллеры      компоненты                                                                  113

  Рис. 6. Мезонинный модуль WIZ200WEB                                                      Рис. 7. Окно редактора Programmers Notepad

MCU = atmega323                                  Подготовительный этап закончен. Теперь                               short main( void )
                                                                                                                      {
                                               можно переходить к редактированию фай-
                                               ла main. c. Его содержимое должно принять                                /* Биты 0, 1 порта PORTF будут работать как ВЫХОДЫ */
                                                                                                                        DDRF |= (1
114                                 компоненты              микроконтроллеры

      Рис. 8. Успешное завершение сборки проекта                                       Рис. 9. Загрузка файла прошивки

                                                               Пока выполняется задача 1, она увеличи-           фикаторов и типах данных, используемых
                                                             вает свой счетчик ul. Когда планировщик             в исходном коде ядра FreeRTOS. Большое
                                                             переводит задачу 1 в состояние готовности,          внимание уделено задаче как базовой еди-
                                                             переменная ul сохраняется в собственном             нице программы для FreeRTOS. Подробно
                                                             стеке задачи 1 и не увеличивается, пока вы-         рассмотрены состояния задачи, дано объяс-
                                                             полняется задача 2. Как только переменная ul        нение понятию приоритета задачи. Описана
                                                             достигает значения 4000, она обнуляется             API-функция создания задачи xTaskCreate().
                                                             (момент времени t1), а логический уровень           Приведен пример наипростейшей про-
                                                             на выводе PF0 инвертируется, однако это мо-         граммы, выполняющейся под управлением
                                                             жет произойти только в течение кванта вре-          FreeRTOS, приведены результаты тестиро-
                                                             мени выполнения задачи 1. Аналогично ведет          вания и описаны происходящие процессы
                                                             себя задача 2, но ее счетчик обнуляется по до-      без углубления во внутреннюю реализацию
      Рис. 10. Напряжение на выводах PF0 и PF1 ATmega128L
                                                             стижении значения 8000. Таким образом, эта          FreeRTOS.
      (сверху вниз), полученное цифровым осциллографом       простейшая программа генерирует меандр                В следующих публикациях будет продол-
                                                             с «плавающим» полупериодом, а разброс               жено рассмотрение задач. Подробно будет
                                                             продолжительности полупериода достигает             рассказано о приоритетах задач, показано,
  FreeRTOSConfig.h. В это время задача 2 на-                 одного системного кванта, то есть 1 мс.             каким образом можно менять приоритеты
  ходится в состоянии готовности. После чего                                                                     во время выполнения программы. Внимание
  вызывается планировщик, который перево-                    Выводы                                              будет уделено правильному способу приоста-
  дит задачу 1 в состояние готовности, а зада-                                                                   навливать задачи на заданное время и фор-
  чу 2 — в состояние выполнения, так как зада-                 В статье были рассмотрены основ-                  мировать задержки. Будет рассказано о задаче
  чи имеют одинаковый приоритет и задача 1                   ные принципы, заложенные во все ОСРВ.               «бездействие» и о функции, вызываемой каж-
  уже отработала один квант времени.                         Описаны соглашения об именах иденти-                дый системный квант времени. Будет показа-
                                                                                                                 но, как правильно уничтожать задачи. Весь
                                                                                                                 материал будет снабжен подробными при-
                                                                                                                 мерами.				                               n

                                                                                                                 Литература

                                                                                                                 1. Курниц А. FreeRTOS — операционная система
                                                                                                                    для микроконтроллеров // Компоненты и тех-
                                                                                                                    нологии. 2011. № 2.
                                                                                                                 2. http://www.freertos.org/implementation/index.
                                                                                                                    html
                                                                                                                 3. http://www.freertos.org/a00015.html
                                                                                                                 4. http://www.freertos.org/taskandcr.html
                                                                                                                 5. http://www.freertos.org/a00017.html
                                                                                                                 6. Barry R. Using the freertos real time kernel:
                                                                                                                    A Practical Guide. 2009.
                                                                                                                 7. http://www.wiznet.co.kr/Sub_Modules/en/
                                                                                                                    product/Product_Detail.asp? cate1=5&cate2=44
                                                                                                                    &cate3=0&pid=1025
                                                                                                                 8. http://winavr.sourceforge.net/download.html
      Рис. 11. Работа программы во времени                                                                       9. http://sourceforge.net/projects/freertos/files/
                                                                                                                    FreeRTOS/

                                                                                                                           КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2011
96                                 компоненты        микроконтроллеры

 Продолжение. Начало в № 2`2011
                                                      FreeRTOS —
                                                      операционная система
                                                      для микроконтроллеров

                                                      В предыдущих статьях [1] читатель познакомился с операционной систе-
                                                      мой реального времени (ОСРВ) для микроконтроллеров (МК) FreeRTOS.
                                                      В данной статье будет продолжено изучение базовой единицы любой
                                                      программы, работающей под управлением FreeRTOS, — задачи. Будет
                                                      рассказано, как передать в задачу в момент ее создания произвольный
                                                      параметр и как создать несколько экземпляров одной задачи. Будет по-
                                                      казано, как блокировать задачу на определенное время и заставить ее
                                                      циклически выполняться с заданной частотой. Автор использует удобную
                                 Андрей Курниц        для демонстрации возможностей FreeRTOS платформу — порт FreeRTOS
                                   kurnits@stim.by    для x86 совместимых процессоров.

                                                                        Подготовка к выполнению FreeRTOS на платформе x86

                                                                          В предыдущей части [1] был приведен пример создания простой
                                                                        программы, работающей под управлением FreeRTOS. Платформой
                                                                        служил МК фирмы AVR ATmega128. Продолжать подробное рас-
                                                                        смотрение и демонстрацию возможностей FreeRTOS на платформе
                                                                        реального МК не всегда удобно. Гораздо удобнее использовать в ка-
                                                                        честве платформы любой x86 совместимый настольный компьютер,
                                                                        используя соответствующий порт FreeRTOS. Все последующие при-
                                                                        меры будут приведены для порта для x86 совместимых процессоров,
                                                                        работающих в реальном режиме. Мы используем бесплатный пакет
                                                                        Open Watcom, включающий Си-компилятор и среду разработки [2],
                                                                        об особенностях установки которого будет сказано ниже. Получаемые
                                                                        в результате компиляции и сборки исполнимые (exe) файлы могут

     Рис. 1. Включение 16‑разрядного компилятора

     Рис. 2. Включение DOS в список целевых ОС                            Рис. 3. Успешная сборка демонстрационного проекта в среде Open Watcom

                                                                                                               КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 4 '2011
микроконтроллеры                   компоненты                                                          97

быть выполнены из интерпретатора команд Windows (cmd.exe). В ка-           Кроме этого, необходимо произвести настройку ядра, отредакти-
честве альтернативы можно использовать бесплатный эмулятор ОС            ровав заголовочный файл FreeRTOSConfig.h:
DOS под названием DOSBox, который позволит выполнять примеры
не только из-под Windows, но и из-под UNIX-подобных (FreeBSD,            #ifndef FREERTOS_CONFIG_H
                                                                         #define FREERTOS_CONFIG_H
Fedora, Gentoo Linux) и некоторых других ОС [2].
  Загрузить последнюю версию пакета Open Watcom можно с офици-           #include 
                                                                         #include 
ального сайта [2]. На момент написания статьи это версия 1.9. Файл для
скачивания: open-watcom-c-win32-1.9.exe. Во время инсталляции пакета     #define configUSE_PREEMPTION                                 1
                                                                         #define configUSE_IDLE_HOOK                                  0
следует включить в установку 16‑разрядный компилятор для DOS и до-       #define configUSE_TICK_HOOK                                  0
бавить DOS в список целевых ОС (рис. 1 и 2).                             #define configTICK_RATE_HZ                                   ( ( portTickType ) 1000 )
                                                                         #define configMINIMAL_STACK_SIZE                             ( ( unsigned short ) 256 )
  После установки пакета Open Watcom нужно выполнить переза-                                                                          /* This can be made smaller if required. */
грузку рабочей станции. Далее можно проверить работу компиля-            #define configTOTAL_HEAP_SIZE                                ( ( size_t ) ( 32 * 1024 ) )
                                                                         #define configMAX_TASK_NAME_LEN                              ( 16 )
тора, открыв демонстрационный проект, входящий в дистрибутив             #define configUSE_TRACE_FACILITY                             1
FreeRTOS. Проект располагается в C:/FreeRTOSV6.1.0/Demo/PC/ (в слу-      #define configUSE_16_BIT_TICKS                               1
                                                                         #define configIDLE_SHOULD_YIELD                              1
чае установки FreeRTOS на диск C:/). Далее следует открыть файл про-     #define configUSE_CO_ROUTINES                                0
екта Open Watcom, который называется rtosdemo.wpj, и выполнить           #define configUSE_MUTEXES                                    1
                                                                         #define configUSE_COUNTING_SEMAPHORES                        1
сборку проекта, выбрав пункт меню Targets -> Make. Сборка должна         #define configUSE_ALTERNATIVE_API                            1
пройти без ошибок (рис. 3).                                              #define configUSE_RECURSIVE_MUTEXES                          1
                                                                         #define configCHECK_FOR_STACK_OVERFLOW                       0 /* Do not use this option on the PC port. */
  При этом в директории демонстрационного проекта появится ис-           #define configUSE_APPLICATION_TASK_TAG                       1
полнимый файл rtosdemo.exe, запустив который можно наблюдать             #define configQUEUE_REGISTRY_SIZE                            0
результаты работы демонстрационного проекта в окне интерпретато-         #define configMAX_PRIORITIES                 ( ( unsigned portBASE_TYPE ) 10 )
ра команд Windows (рис. 4).                                              #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

                                                                         /* Set the following definitions to 1 to include the API function, or zero
                                                                         to exclude the API function. */

                                                                         #define INCLUDE_vTaskPrioritySet               1
                                                                         #define INCLUDE_uxTaskPriorityGet              1
                                                                         #define INCLUDE_vTaskDelete                    1
                                                                         #define INCLUDE_vTaskCleanUpResources          1
                                                                         #define INCLUDE_vTaskSuspend                   1
                                                                         #define INCLUDE_vTaskDelayUntil                1
                                                                         #define INCLUDE_vTaskDelay                     1
                                                                         #define INCLUDE_uxTaskGetStackHighWaterMark 0 /* Do not use this option on the PC port. */

                                                                         #endif /* FREERTOS_CONFIG_H */

                                                                         Передача параметра в задачу при ее создании

  Рис. 4. Работа демонстрационного проекта в среде Windows                 На этом подготовительный этап можно считать завершенным.
                                                                         Как говорилось в [1], при создании задачи с помощью API-функции
                                                                         xTaskCreate() есть возможность передать в функцию, реализующую
  В демонстрационный проект включена демонстрация всех воз-              задачу, произвольный параметр.
можностей FreeRTOS. Для наших целей, чтобы продолжить изучение             Разработаем учебную программу № 1, которая будет создавать два
задач, не вникая в остальные возможности FreeRTOS, необходимо            экземпляра одной задачи. Чтобы каждый экземпляр задачи выполнял
исключить из проекта все исходные и заголовочные файлы, кроме            уникальное действие, передадим в качестве параметра строку симво-
файлов ядра FreeRTOS и файла main.c (рис. 5).                            лов и значение периода, которое будет сигнализировать о том, что
                                                                         задача выполнена. Для этого следует отредактировать файл main.c:

                                                                         #include 
                                                                         #include 
                                                                         #include 
                                                                         #include “FreeRTOS.h”
                                                                         #include “task.h”

                                                                         /* Структура, содержащая передаваемую в задачу информацию */
                                                                         typedef struct TaskParam_t {
                                                                            char          string[32]; /* строка */
                                                                            long          period;		 /* период */
                                                                         } TaskParam;

                                                                         /* Объявление двух структур TaskParam */
                                                                         TaskParam xTP1, xTP2;

                                                                         /*-----------------------------------------------------------*/
                                                                         /* Функция, реализующая задачу */
                                                                         void vTask( void *pvParameters )
                                                                         {
                                                                            volatile long ul;
                                                                            volatile TaskParam *pxTaskParam;

                                                                           /* Преобразование типа void* к типу TaskParam* */
                                                                           pxTaskParam = (TaskParam *) pvParameters;

                                                                           for( ;; )
  Рис. 5. Минимально необходимый набор исходных и заголовочных файлов      {
  в среде Open Watcom                                                    		 /* Вывести на экран строку, переданную в качестве параметра при создании задачи */
                                                                         		 puts( (const char*)pxTaskParam->string );

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 4 '2011                                                                                                                                       www.kite.ru
Вы также можете почитать