HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
РадиоЛоцман - Все об электронике

MPLAB Harmony: писать программы для PIC32 стало проще

Microchip MPLAB Harmony

Журнал РАДИОЛОЦМАН, февраль 2014

Михаил Русских

Приводится описание программной структуры MPLAB Harmony, рассматривается установка плагинов и подключение модулей к проекту, описывается структура проекта в соответствии с концепцией MPLAB Harmony

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Компания Microchip давно известна на отечественном рынке микроконтроллеров. Ее 8-разрядные устройства серии PIC16 и PIC18 до сих пор ценятся разработчиками. Microchip также производит качественные 16-разрядные микроконтроллеры серий dsPIC30, dsPIC33 и PIC24, используемые в схемах управления двигателями и в малых мультимедийных системах. В сегменте 32-разрядных устройств эта компания поначалу была на лидирующих позициях, представив в 2007 году микроконтроллеры семейства PIC32MX с тактовой частотой до 80 МГц и производительностью до 120 млн. итераций основного цикла в секунду (DMIPS). Но выбранное ядро MIPS32, хотя и обладало значительной вычислительной мощностью, все же не было столь популярным, как Cortex-M3, которым оснащались устройства конкурентов, таких как Atmel и STmicroelectronics. Более того, впоследствии конкуренты стали использовать ядро Cortex-M4, благодаря чему их продукция значительно выиграла в производительности. Например, микроконтроллеры серии STM32F42x компании STmicroelectronics могут работать на частоте до 180 МГц и выполнять до 225 DMIPS. Популярности ядру Cortex также добавляет то, что единые среды разработки, например, Keil и CooCox, поддерживают множество устройств с данным ядром, а стандарт программного интерфейса CMSIS (Cortex Microcontroller Software Interface Standard) делает программирование максимально удобным и быстрым. Но Microchip вновь стремится выйти в лидеры, в связи с чем в конце 2013 года она выпустила микроконтроллеры семейства PIC32MZ, работающие на частоте до 200 МГц и обладающие производительностью 330 DMIPS. Этот рывок был бы не таким значительным, если бы компания не представила базовую программную структуру MPLAB Harmony, речь о которой пойдет в данной статье.

MPLAB Harmony, по сути, является фреймворком, включающим в себя программные модули, которые выступают в роли строительных блоков при создании приложения. Используя MPLAB Harmony, разработчик может включить в свой проект библиотеки и программные драйверы как компании Microchip, так и сторонних производителей. Кроме того, фреймворк поддерживает такие операционные системы реального времени, как FreeRTOS и OPENRTOS. Блочная структура позволяет осуществить принцип «разделяй и властвуй» при программировании своего приложения. Это значит, что библиотеки и модули не используют какие-либо глобальные переменные и не делят между собой одни и те же регистры. Таким образом, каждый модуль может распоряжаться только своими ресурсами, что напоминает принцип инкапсуляции, принятый в объектно-ориентированном программировании. Если одному модулю нужно использовать ресурсы другого, то он вызовет интерфейсную функцию этого модуля. Это упрощает взаимодействие между модулями и позволяет избежать конфликтов внутри программы.

Модули в MPLAB Harmony делятся на четыре категории: библиотеки периферии, драйверы устройств, системные службы и промежуточное программное обеспечение (middleware). Библиотеки периферии (PLIB) обеспечивают низкоуровневый интерфейс с периферийными модулями, позволяя программисту не задумываться о том, что происходит на уровне регистров, чем, в свою очередь, облегчают написание драйверов для других моделей микроконтроллеров семейства PIC32. Библиотеки, однако, не предназначены для применения непосредственно в приложении, поскольку при использовании нескольких библиотек очень высока вероятность конфликта, возникающего при распределении ресурсов. Поэтому драйверы устройства, или просто драйверы, являются надстройкой над этими библиотеками и обеспечивают простое и высокоабстрактное взаимодействие с периферийными модулями с помощью определенных функций. Применение драйверов также позволяет избежать конфликтов между библиотеками. Middleware-модули необходимы для организации работы периферийных блоков со сложными протоколами, например, стеков TCP/IP, USB, интерфейса работы с графикой. За тем, чтобы драйверы или middleware-модули не конфликтовали между собой из-за каких-либо общих ресурсов, следят системные службы. Например, если стеки интерфейсов TCP/IP и USB при отсчете времени для своих периодических задач должны использовать один и тот же таймер, то во избежание конфликта отслеживание обращений к этому таймеру нужно поручить системной службе.

Драйверы, системные службы и middleware-модули являются активными. Это значит, что они могут работать в фоновом режиме, то есть при вызове интерфейсной функции модуля возврат из этого модуля произойдет практически сразу, а сам он продолжит работу над указанной ему задачей. Большинство модулей имеет механизм уведомлений, поэтому приложение сможет вовремя определить момент завершения задачи.

Каждый модуль реализован по принципу конечного автомата. У него обязательно должна быть функция инициализации и одна или несколько функций выполнения задач. Инициализация происходит практически сразу же в функции main() после включения или перезагрузки микроконтроллера. В бесконечном цикле, то есть во время стандартной работы микроконтроллера, модулем последовательно выполняются задачи в соответствии со структурой конечного автомата. Благодаря такому подходу могут одновременно работать несколько модулей и само приложение, выполняя операции поочередно. Таким образом, реализуется принцип многозадачности.

Установка плагинов MPLAB Harmony

Установка MPLAB Harmony [1] происходит быстро и не вызывает затруднений. После установки в среде разработки MPLAB X [2] следует добавить рекомендуемые плагины. В главном меню MPLAB X во вкладке Tools нужно выбрать Plugins. Затем необходимо перейти в каталог с установленной MPLAB Harmony, в нем зайти в директорию /utilities/configurator и выбрать файл com-microchip-harmonyconfigurator.nbm. Этот файл позволяет подключить конфигуратор, благодаря которому пользователь сможет в среде MPLAB X с помощью графического интерфейса добавлять к своему проекту различные модули Harmony. Помимо этого плагина, Microchip также рекомендует подключить файл с документацией com-microchip-harmony_help.nbm, находящийся в папке [каталог MPLAB Harmony]/doc. После выбора этих файлов во вкладке Downloaded окна Plugins (Рисунок 1) нужно нажать Install для установки этих плагинов. В результате во вкладке Tools главного меню должен появиться пункт MPLAB Harmony Configurator.

MPLAB Harmony: писать программы для PIC32 стало проще
 Рисунок 1. Установка плагинов MPLAB Harmony.

Подключение модулей MPLAB Harmony

Добавление модулей к проекту с помощью MPLAB Harmony Configurator также не сопряжено с какими-либо сложностями. Подключать модули можно как к имеющимся проектам, уже содержащим свои файлы с исходным кодом, так и к только что созданному пустому проекту. Во втором случае MPLAB Harmony может создать для проекта шаблон, включающий в себя файл main.c. Процедура подключения состоит из четырех шагов. Сначала нужно указать корневой каталог MPLAB Harmony, в котором должен присутствовать файл manifest.xml. В этом файле имеется вся информация о программных модулях текущей версии MPLAB Harmony. Далее требуется выбрать необходимые для проекта модули. По умолчанию отмечены только пункты Required Files в Peripheral Library Headers->Peripheral Library Module и configurations->PIC32. Они позволят присоединить к проекту шаблонные заголовочные и конфигурационные файлы. Остальные пункты пользователь выбирает по своему усмотрению. В зависимости от выбранных модулей, на третьем шаге программа предложит либо перейти дальше, либо уделить время настройке модуля. Например, при подключении простых драйверов для UART или АЦП никаких дополнительных настроек не потребуется, все необходимые значения будут находиться в файлах system_config.h и system_init.c. А при выборе серьезного middleware-модуля, например, стека USB или TCP/IP, пользователь сможет настроить дополнительные параметры, связанные с этим модулем (Рисунок 2). На последнем шаге пользователю будет предложен выбор: включить шаблон приложения MPLAB Harmony в свой проект или нет. Включать его следует при создании проекта с нуля, тогда к нему будут добавлены файлы, соответствующие концепции построения приложения с помощью MPLAB Harmony. К этим файлам относится и main.c, поэтому в случае уже имеющегося приложения этот файл будет перезаписан, что может привести к потере части программы. Также следует отметить, что при использовании библиотек MPLAB Harmony в проекте должны быть прописаны пути к заголовочным файлам используемых модулей. Сделать это можно, выбрав в главном меню File->Project Properties. В появившемся окне в разделе General посредством кнопки add нужно добавить пути [каталог MPLAB Harmony]/framework и [каталог MPLAB Harmony]/bin/framework/Peripheral. Также нужно прописать путь к файлу system_config.h, который желательно поместить в папку своего проекта.

MPLAB Harmony: писать программы для PIC32 стало проще
Рисунок 2. Настройка стека TCP/IP с помощью MPLAB Harmony Configurator.

Структура проекта

Проект, созданный с помощью MPLAB Harmony, имеет достаточно четкую и продуманную структуру (Рисунок 3). Основными разделами, в которых содержатся интересующие нас файлы, являются Source files (файлы с исходным кодом) и Header files (заголовочные файлы). Дерево каталогов внутри этих разделов должно быть одинаковым, поэтому уделим внимание файлам с исходным кодом, содержащимся в Source files. В каталоге app имеются файлы main.c и app.c. Хотя сложные проекты могут содержать здесь также дополнительные файлы. Концепция MPLAB Harmony предполагает, что файл main.c должен быть максимально простым, поэтому его код (Листинг 1) образует только базовый каркас программы. Как уже можно судить по названию, в этом файле реализована обязательная в языке C функция main(). В ней сначала вызывается функция SYS_Initialize(), целью которой является инициализация каждого используемого в приложении модуля. Поскольку работа модулей основывается на автоматном подходе, эта функция должна перевести автомат каждого модуля в начальное состояние. После инициализации программа сразу переходит в бесконечный цикл, из которого при нормальной работе программа никогда не должна выйти. Последние две строчки сигнализируют о возникновении нештатной ситуации и завершают работу программы возвратом из функции main(). Внутри бесконечного цикла вызывается функция SYS_Tasks(). Она поочередно обращается к каждому модулю, что позволяет функционировать системе в целом. Следует отметить, что некоторые модули могут работать по прерываниям, поэтому они могут не вызываться функцией SYS_Tasks().

MPLAB Harmony: писать программы для PIC32 стало проще
Рисунок 3. Структура проекта в соответствии с концепцией MPLAB Harmony.

Листинг 1.

int main ( void )
{
/* Инициализация системы */
SYS_Initialize ( NULL );
while ( true )
{
/* Выполнение задач */
SYS_Tasks ( );
}

/* Нештатная ситуация, завершение программы */
SYS_ASSERT ( false , "Error! Exiting main" );
return ( EXIT_FAILURE );
}

В файле app.c реализуется логика работы самого приложения. Этот файл должен иметь функции APP_Initialize() и APP_Tasks(). Вызываемая из SYS_Initialize(), функция APP_Initialize() обязана непосредственно перевести автомат каждого модуля приложения в начальное состояние, а также может при необходимости выполнить дополнительную инициализацию. Функция APP_Tasks(), в свою очередь, вызывается из SYS_Tasks(). В ней выполняемые приложением действия делятся на небольшие задачи, которые нужно исполнить максимально быстро. При этом между задачами одного модуля должен быть определенный временной промежуток, за который должны быть выполнены задачи других модулей. После завершения одной задачи, конечный автомат переходит в следующее состояние для выполнения другой задачи. Автоматный подход здесь реализуется структурой switch-case. Примерный каркас функции APP_Tasks() представлен в Листинге 2. В нем описан простой автомат, определяющий логику работы модуля и имеющий четыре состояния: APP_STATE_INIT, APP_STATE_WAIT_FOR_READY, APP_STATE_WAIT_FOR_DONE и APP_STATE_IDLE. В первом происходит конечная подготовка модуля к работе, например, открытие порта. Если эта подготовка проходит успешно, то выполняется переход в состояние APP_STATE_WAIT_FOR_READY, где проверяется, готов ли модуль выполнить свою задачу, например, готов ли порт переслать данные. Если да, то совершается переход в следующее состояние, в противном случае автомат остается в этом состоянии до готовности модуля. В состоянии APP_STATE_WAIT_FOR_DONE ожидается, когда модуль завершит свою задачу. В случае с портом, это может быть отправка последнего байта. Если модулю больше не нужно выполнять какие-либо задачи, то он может быть переведен в пассивное состояние APP_STATE_IDLE. В этом случае при обращении к функции APP_Tasks() никакие действия внутри нее не выполняются. Если модуль из работы выводить не нужно, то автомат можно переключить во второе состояние. Серьезные проекты могут иметь более сложную автоматную структуру.

Листинг 2.

void APP_Tasks(void)
{
switch (state)
{
case APP_STATE_INIT:
{
/*Конечная подготовка модуля*/
}
case APP_STATE_WAIT_FOR_READY:
{
/*Проверка модуля на готовность выполнения задачи*/
}
case APP_STATE_WAIT_FOR_DONE:
{
/*Ожидание завершения задачи и переход в состояние APP_STATE_IDLE*/
}
/* Переход в нерабочее состояние */
case APP_STATE_IDLE:
default:
break;
}
}

В каталоге app имеется каталог system_config, в котором также содержится один или несколько подкаталогов, которые отвечают за конфигурацию приложения. Создаваемый проект может иметь несколько конфигураций, и в каждой из них можно назначить определенный набор используемых библиотек или модулей и изменить интересующие настройки проекта, например, конфигурационные биты. Это сделано для удобного портирования программы при работе с несколькими файлами. Обычно в system_config содержатся следующие файлы: system_config.h, system_init.c, system_tasks.c, system_int.c. В заголовочном файле system_config.h прописываются константы и начальные значения величин, используемых в подключенных модулях. В system_init.c содержится вызываемая из main() функция SYS_Initialize(). В system_tasks.c, соответственно, имеется функция SYS_Tasks(). Но, как уже ранее упоминалось, работающие по прерываниям модули не вызываются из SYS_Tasks(), вместо этого в файле system_int.c прописаны обработчики прерываний, в которых происходит вызов зависимых от прерывания задач.

Помимо директории app, содержимое файлов которой может и должен менять пользователь, существует еще директория framework. В ней находятся файлы с кодом модулей MPLAB Harmony. В зависимости от сложности проекта она может содержать большое число файлов и подкаталогов. Для нормальной работы приложения пользователь не должен вносить изменения в эти файлы.

Заключение

MPLAB Harmony является отличным помощником при программировании микроконтроллеров семейства PIC32. Благодаря четкой структуре проекта и продуманной концепции добавлять модули и изменять их параметры стало намного проще. Таким образом, компания Microchip создала для своих устройств нечто вроде CMSIS для микроконтроллеров с ядром Cortex, чем упрочила свои позиции на рынке.

Ссылки

  1. microchip.com/pagehandler/en_us/devtools/mplabharmony/home.html
  2. microchip.com/pagehandler/en-us/family/mplabx/

Перевод: Mikhail R по заказу РадиоЛоцман

15 предложений от 15 поставщиков
Программатор/отладчик PIC контроллеров PICKIT3 с фирменным логотипом Microchip. Позволяет внутрисхемно программировать и отлаживать все чипы производства компании Microchip. Среда разработки MPLAB...
AliExpress
Весь мир
Точечный TC2030-MCP-NL-10 кабель без ножек, схема MPLAB в отладчике ICD4 ICD3 ICD2, кабели зарядного устройства2 008 ₽
Десси
Россия
Программатор/отладчик PIC контроллеров PICKIT3 с фирменным логотипом Microchip. Позволяет внутрисхемно программировать и отлаживать все чипы производства компании Microchip. Среда разработки MPLAB IDE.3 010 ₽
Триема
Россия
DV164005 MPLAB (ICD 2 Module and USB cable)23 148 ₽
MPLAB-IC2по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя