Введение и описание проблемы
Одной из современных тенденций развития вычислительных систем является выход за рамки персональных компьютеров и распространение вычислительных устройств во всех сферах жизни человека в виде встраиваемых систем и сетей. Встраиваемые системы и сети принято определять как специализированные микропроцессорные системы, непосредственно взаимодействующие с объектом контроля или управления и объединенные с ним конструктивно.
Одной из разновидностей встраиваемых систем являются микроконтроллерные системы, основным вычислительным элементом в которых выступает микроконтроллер. Особенностью микроконтроллеров как вычислителей, в отличие от обычных микропроцессоров, является то, что они интегрируют на одном кристалле и микропроцессор, и память, и наборы вспомогательных схем, которые позволяют генерировать сигналы различных форм, собирать информацию с датчиков и управлять подключаемыми устройствами. Это упрощает создание системы и уменьшает время на разработку аппаратной части. Интеграция компонентов на одном кристалле позволяет создавать высокоэффективные решения и удовлетворять наиболее сложным требованиям. Благодаря этим качествам микроконтроллерные системы широко используются в быту (бытовая техника, мобильные системы, системы умного дома), биомедицине, робототехнике, производстве (киберфизические системы), системах мониторинга (сенсорные сети), опытно-конструкторской деятельности по разработке новых устройств.
При огромном многообразии в современном мире технологий обработки данных особую роль приобретают технологии, позволяющие организовать совместную работу устройств с разной архитектурой, связать их в единую систему. Несмотря на возрастающий интерес к подобного рода гетерогенным распределенным системам, успехов в этой области меньше, чем можно было бы предполагать, в частности, уровень применения специализированных технологий описания протоколов и средств, позволяющих сгенерировать реализацию протоколов по описанию, остается невысоким. В особенности, этот недостаток ощущается в области встраиваемых микроконтроллерных систем. Как правило, такие системы являются распределенными, и даже если они состоят из одного вычислительного модуля, в нем может быть несколько активных и взаимодействующих между собой элементов, которые связаны соответствующими интерфейсами.
Существует большое количество разнообразных активных электронных компонентов (аналого-цифровые преобразователи, память, радиомодули, драйверы шаговых двигателей и т. д.) с фиксированной логикой. Под фиксированной логикой будем понимать логику работы электронного компонента, которую разработчик встраиваемой системы не в состоянии поменять. С его точки зрения логика работы компонента скрыта, а компонент представляет собой условно «черный ящик» с четко определенным интерфейсом и протоколом. В самом распространенном случае интерфейс и протокол взаимодействия с компонентом описаны в текстово-графической форме в документации (спецификации) на компонент.
В случае, когда отсутствует соответсвующая специализированная библиотека, реализация протокола взаимодействия с компонентом предполагает значительные трудозатраты, увеличивает общий срок разработки, снижает надежность системы. При этом существующие библиотечные реализации недостаточно эффективны с точки зрения потребления ресурсов, поскольку они должны быть универсальными — поддерживать различные типы и виды микроконтроллеров. Таким образом, проблема разработки методов, моделей, алгоритмов и программных средств, позволяющих автоматизировать эту работу, за счет описания на формальном языке взаимодействия элементов в микроконтроллерных распределенных системах, несомненно, является актуальной.
Обзор аналогов
Проблема взаимодействия распределенных компонентов исследуется со времен появления первого программируемого радиокомпонента. Известны методы формальных описаний (МФО), стандарты ITU (в реализации SDL, MSC, ASN и т. д.), модель OSI и др. [1] Одной из причин ограниченного распространения методов формального описания на практике является отсутствие специализированных компиляторов с языков описания протоколов на промежуточный язык с учетом специфики предметной области микроконтроллерных систем.
Существуют инструменты, позволяющие описать какой-либо протокол одним из перечисленных методов с возможностью сгенерировать код шаблонов функций на целевом языке программирования по описанному протоколу для дальнейшего программирования его реализации на целевом языке. Основным недостатком такого подхода является невозможность генерации реализации описанного с помощью языков МФО протокола. Такие инструменты позволяют автоматизировать лишь процесс объявления функций, что не является значительным преимуществом по сравнению со стандартным программированием взаимодействия с устройством.
Многие современные среды разработки программ для микроконтроллерных систем (MPLAB X IDE [2], STM32Cube Embedded Software [3], Renesas e² studio [4]) имеют конфигураторы драйверов и периферии (таймеры, драйверы ШИМ, драйверы портов GPIO, интерфейсов I2C, SPI, UART и др.), но все они предлагают только генерацию инициализационного кода и не позволяют манипулировать высокоуровневыми функциями прикладного уровня для взаимодействия с внешними устройствами, ограничиваясь функциями канального уровня модели OSI [5]. Таким образом, программист реализует функции прикладного уровня, манипулируя низкоуровневыми функциями канального уровня. Если разработчик с помощью таких инструментов создает библиотеку с высокоуровневыми функциями, то она является специализированной и ориентированной на конкретное устройство и конкретный микроконтроллер.
Одной из интересных работ в этой области является исследовательский проект лаборатории «LaBRI – University of Bordeaux» под названием «z2z» [6], посвященный генерации программной реализации протоколов. Задача проекта — автоматическая генерация программного кода, реализующего протокольный шлюз в телекоммуникационных системах. В статье [6] рассматривается проблема реализации протокольного шлюза, объединяющего различные протоколы («SIP for telephones, RTSP for televisions, X2D for thermostats, X10 for lamps») в системах «Умный дом». Системы подобного типа практически всегда являются гетерогенными и требуют поддержки различных протоколов. В проекте используется 3 разных предметно-ориентированных языка (DSL) для описания «protocol behaviors, message structures, and the gateway logic» с последующей генерацией Си-кода:
- DSL PS («Protocol specification») описывает базовые свойства протокола (tcp\upd, unicast\multicast, sync\async);
- DSL MS («Message specification») позволяет описывать шаблон для разбора приходящих сообщений и шаблон для генерации исходящих сообщений;
- DSL MT («Message translation») – Си-подобный язык для манипулирования с входящими и исходящими сообщениями, задания логики работы шлюза.
В качестве другого аналога можно привести исследовательский проект «Melange» [7]. Для наиболее распространенных сетевых протоколов и структур данных (Ethernet frame, IPv4, ICMP, TCP, UDP, SSH, DNS, DHCP) в самом распространенном случае реализация выполняется вручную, а данный способ, как правило, ведет к типичным для языка Си переполнениям буфера и другого рода ошибкам. Цель проекта — автоматическая генерация реализации сетевых протоколов и структур данных, верификация полученных реализаций, и, как следствие, оптимизация скорости работы по сравнению с ручной реализацией. Основу подхода составляют два языка описаний и их трансляторы на язык OCaml. Первый язык описания — это Meta Packet Language или MPL, описывающий структуру пакета. Второй язык, Statecall Policy Language или SPL, основан на модели конечных автоматов. В работе приводятся референсные реализации DNS и SSH-сервера и произведено сравнение с BIND и OpenSSH. OCaml-реализации давали по сравнению с традиционными прирост производительности от незначительного до почти двукратного.
Отметим, что оба аналога хотя и решают похожую задачу, но не учитывают специфики встраиваемых систем и сетей.
Описание предлагаемого подхода к взаимодействию микроконтроллера и электронных компонентов с фиксированной логикой работы
Целью настоящего исследования является разработка универсального инструмента, который позволит на основании описания протокола на высокоуровневом предметно-ориентированном языке сгенерировать программный код, обеспечивающий взаимодействие устройств микроконтроллерной системы. При этом используется общий подход аналогичный «z2z» и «Melange», но целью является генерация специализированной библиотеки, предоставляющей пользователю высокоуровневый интерфейс прикладного программирования (API) для взаимодействия устройств в распределенных встраиваемых системах.
Для реализации предлагаемого подхода разработано три предметно-ориентированных языка описания взаимодействия пользователя с устройством:
- Device Interface Specification (DIS), описывающий интерфейс взаимодействия с устройством;
- Library Interface Specification (LIS), описывающий интерфейс взаимодействия с библиотекой;
- Message Translation Specification (MTS), описывающий трансляцию сообщений из LIS в DIS.
По описанию протокола взаимодействия и интерфейсов на этих языках генерируется библиотека, предоставляющая высокоуровневый прикладной интерфейс для взаимодействия с устройством. Общая схема взаимодействия пользователя с устройством и место языков описания протокола в системе отражены на рисунке 1.
Рисунок 1 — Схема взаимодействия пользователя с устройством и место языков описания протокола в системе
1. Описание языка Device Interface Specification
Язык DIS позволяет задать требуемые параметры интерфейса взаимодействия с устройством для корректного обмена данными. Для этого необходимо описать информационную модель устройства и интерфейс взаимодействия.
При описании информационной модели устройства необходимо указать ее вид и параметры. Язык позволяет описывать информационные модели, в основе которых могут быть регистры, команды или прямое управление выводами (bit-bang). При этом перечень информационных моделей может быть расширен. Если устройство поддерживает несколько видов информационных моделей, то все они должны быть описаны.
Информационная модель, основанная на понятии регистра, используется, когда устройство с точки зрения пользователя может быть представлено как последовательность (поле) регистров, а управление происходит посредством записи данных в определенный регистр или считывания значения регистра. В качестве параметров модели необходимо указать разрядность регистров. Пользователю предоставляются две функции — getRegisterValue(<адрес регистра>)
для считывания значения регистра и setRegisterValue(<адрес регистра>, <записываемое значение>)
для записи в регистр. Описание этих функций генерируется автоматически на основе других параметров, задаваемых на языке DIS. Имеется возможность в качестве адреса регистра и устанавливаемых значений указывать не числовые данные, а имена, что позволяет значительно повысить читаемость кода и удобство программирования.
Второй тип информационной модели основан на понятии команд, при помощи которых происходит управление устройством. При описании системы команд необходимо для каждой команды задать имя, параметры и возвращаемое значение, а также описать все структуры данных и константы, используемые в параметрах и возвращаемых значениях.
Формат описания команды:
[<возвращаемое значение>] <имя команды>: <фиксированный параметр>|<переменный параметр>{<фиксированный параметр>|<переменный параметр>}
Корректно описанные команды используются при формировании логики трансляции сообщений на языке MTS.
Пример описания команды:
myCommand: “10”{4bits/address}{6bits/val1}”0”{3bits/val2}{2bits/status}
Здесь фиксированные биты указываются в кавычках, а переменные биты (подставляемые параметры) в фигурных скобках. Для последних задается количество кодируемых бит и название переменной.
Для приведенной команды сгенерированная функция будет выглядеть следующим образом:
void Async_Cmd1(int address, int val1, int val2, int status)
При этом можно объявить именованные константы и передавать их в качестве параметров вместо числовых значений, когда это необходимо.
Третьим типом инфомрационной модели является bit-bang, основанный на прямом управлении выводами. Программа непосредственно устанавливает состояние выводов на микроконтроллере, тем самым, такой режим работы позволяет управлять выводами почти так же, как если бы это были выводы микроконтроллера.
В качестве параметров необходимо указать режим работы: синхронный, асинхронный. В режиме синхронного bit-bang данные передаются на вывод только если в устройстве есть место для данных, которые будут прочитаны из соответсвующих пинов. В этом режиме перед отправкой байта при передаче данных сначала будут прочитаны данные с шины. Поэтому до начала вывода данных необходимо отправить на принимающее устройство контрольный байт для инициализации операции. В синхронном режиме данные читаются с пинов и записываются одновременно в полнодуплексном режиме (по аналогии с SPI).
Основным отличием асинхронного режима bit-bang в том, что все взаимодействие происходит через буфер. Данные передаются в буфер непрерывно с частотой тактового сигнала, и, когда необходимо, считываются из буфера другим устройством. Набор функций, используемый в синхронном и асинхронном режиме, идентичен.
При генерации реализации библиотечных функций управления регистрами, командами, выводами необходимо знать интерфейс подключения устройства к микроконтроллеру для вызова нужных низкоуровневых функций отправки/приема байт. По этой причине при описании устройства на языке DIS необходимо указать интерфейс подключения устройства к микроконтроллеру.
На данный момент наиболее распространенными интерфейсами в области встраиваемых систем являются следующие: UART, SPI, I2C, 1-wire, SMBus, CAN, LIN, RS232, RS485, USB, MIDI, Ethernet [8]. Для каждого интерфейса подключения можно выделить особенности или шаблоны взаимодействия. Это может быть, например, способ синхронизации, режим работы, топология и т. п.
В качестве примера можно привести интерфейс SPI, который требует синхронизации для обеспечения правильной работы. Поскольку существуют три основных способа синхронизации: обмен по опросу готовности, использование аппаратных прерываний и поллинг (polling), при описании интерфейса взаимодействия SPI нужно выбрать один из указанных способов.
2. Описание языка Library Interface Specification
На языке LIS описывается интерфейс генерируемой библиотеки. Это гибко настраиваемый под нужды пользователя язык описания структур данных и сигнатур функций прикладного интерфейса библиотеки. На языке LIS специфицируются все функции и структуры данных, которые предоставляются пользователю библиотеки в качестве API. Разрабатывая программу для микроконтроллера, который взаимодействует с каким-либо устройством, пользователь сможет подключить сгенерированную библиотеку и вызывать функции или манипулировать структурами данных из нее.
У каждой функции может присутствовать свой набор параметров и возвращаемое значение. В случае, когда встречаются параметры и возвращаемые значения сложного типа, для всех таких типов описываются их структуры. Таким образом, язык LIS предназначен только для внешней спецификации функций, а алгоритмы реализации этих функций описываются на языке MTS, в основе которого лежит модель конечных автоматов.
3. Описание языка Message Translation Specification
На языке MTS описывается алгоритм реализации функций, объявленных в LIS. В качестве модели в MTS используется Автомат Мили — конечный автомат, выходная последовательность которого (в отличие от автомата Мура) зависит от состояния автомата и входных сигналов [9]. В вершины графа автомата Мили записываются выходящие сигналы, а дугам графа приписывают условие перехода из одного состояния в другое, а также входящие сигналы. Дуге при описании в соответствие может быть поставлено условие (событие), которое обеспечит возможность перехода по данной дуге, и действия, которые необходимо выполнить после перехода по дуге в новое состояние. В качестве действий могут быть указаны функции интерфейса устройства низкого уровня, описанные на DIS, функции интерфейса библиотеки высокого уровня (описываемые другими конечными автоматами) или описание на языке Си.
Таким образом, спецификация на языке MTS представляет собой композицию конечных автоматов, оперирующую LIS-спецификациями высокого уровня и DIS-спецификациями интерфейса устройства низкого уровня.
Пример описания взаимодействия микроконтроллера AVR ATmega с АЦП ADS1258
В качестве примера на трех предлагаемых языках было описано взаимодействие микроконтроллера ATmega семейства AVR с высокоточным аналого-цифровым преобразователем ADS1258 [10].
На языке LIS объявлена функция для вывода напряжения с аналогового входа AIN0 в Serial порт. Поскольку функция не возвращает значений и у нее нет параметров в объявлении каких-либо структур данных нет необходимости. АЦП подключается по интерфейсу SPI, поэтому на языке DIS приводится полное описание интерфейса и его параметров, а также объявление констант для именования регистров и их значений.
Язык MTS описывает функцию вывода напряжения в Serial порт через последовательность вызовов низкоуровневых функций setRegisterValue и getRegisterValue, поскольку у устройства ADS1258 информационная модель — регистры. Чтобы перейти в состояние готовности к считыванию значения напряжения (Ready to Read Voltage), необходимо сначала сконфигурировать устройство. Поэтому для перехода в это состояние выполняется установка необходимых значений регистров для конфигурирования АЦП, что отражено над дугой-переходом после символа “/”. Теперь для перехода в состояние готовности к выводу значения напряжения (Ready to Print), необходимо сначала считать значение напряжения с уже сконфигурированного устройства, что также отражено у дуги перехода в это состояние.
Для завершения процедуры вывода напряжения и перехода в конечное состояние необходимо вывести полученное значение напряжения в Serial порт. Детально данный пример представлен в таблице 1.
Таблица 1 — Описание взаимодействия ATmega и ADS1258 на языках LIS, DIS и MTS
LISData structures: Functions: |
DISInformation model: registers |
MTS |
Заключение
В работе предлагается новый подход к генерации программных средств, обеспечивающих взаимодействие устройств в распределенной микроконтроллерной среде по высокоуровневому описанию. Разработаны три предметно-ориентированных языка высокоуровневого описания протокола взаимодействия устройств в микроконтроллерных системах. Выполнен сравнительный анализ предлагаемого подхода с известными аналогами, в результате которого выявлены следующие его преимущества:
Сокращение времени на разработку за счет автоматической генерации кода, обеспечивающего взаимодействие с устройством по высокоуровневому
Сокращение времени на внесение изменений и перегенерацию кода, а также добавление дополнительных функций, метода шифрования, контрольных сумм и т. п.
За счет повышения уровня разработки увеличивается надежность сгенерированного программного кода
Возможность получения более эффективного исполняемого кода за счет генерации под конкретный микроконтроллер
В настоящее время проект находится на стадии реализации алгоритмов генерации программного кода. При этом используется инструментальная среда для реализации языков программирования ANTLR [11]. В дальнейшем планируется расширить список поддерживаемых интерфейсов и информационных моделей устройств.
Список использованных источников
1 International Telecommunication Union (ITU). Ссылка на источник: http://www.itu.int
2 MPLAB Code Configurator. Ссылка на источник: http://www.microchip.com/mplab/mplab-code-configurator
3 STM32Cube initialization code generator. Ссылка на источник: http://www.st.com/en/development-tools/stm32cubemx.html
4 Renesas Peripheral Driver Generator. Ссылка на источник: https://www.renesas.com/en-us/products/software-tools/tools/code-generator/peripheral-driver-generator.html
5 H. Zimmermann OSI Reference Model // The IS0 Model of Architecture for Open Systems Interconnection, IEEE Transactions on communications, Vol. Com-28, No. 4, April 1980.
6 LaBRI – University of Bordeaux Z2Z: Automatic Generation of Network Protocol Gateways. Ссылка на источник: https://pages.lip6.fr/Julia.Lawall/middleware09.pdf
7 Anil Madhavapeddy — Creating high-performance, statically type-safe network applications, University of Cambridge Computer Laboratory, ISSN-1476-2986, 2010. Ссылка на источник: http://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-775.pdf
8 Большаков О.С., Шаров В. Г., Петров А. В. Реализация кроссплатформенности программ для специализированных распределенных встраиваемых систем // Вестник Череповецкого государственного университета. – Череповец, 2015. – №7(68). — С. 8-13. Ссылка на источник: http://mcublocks.com/wp-content/uploads/2016/07/MCUBlocks_Crossplatform.pdf
9 Хопкрофт Д., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений; пер. с англ. – М.: «Вильямс», 2002.
10 16-Channel 24-Bit Analog-to-Digital Converter (Rev. G) Data Sheet. Ссылка на источник: http://www.ti.com/lit/ds/sbas297g/sbas297g.pdf
11 ANTLR (ANother Tool for Language Recognition). Ссылка на источник: http://www.antlr.org/
Добавить комментарий