Белые кнопки клавиатуры крупным планом

Фото: eskipaper.com

Программирование для меня - это совокупные действия в процессе разработки и эксплуатации электроники, целью которых является формирование ожидаемой модели поведения конечного оборудования с учётом управляющих команд оператора и возмущающих воздействий реального мира. Мою специализацию в области программирования отражает следующий перечень используемых САПР:

  • MATLAB - обработка «сырых» данных, взаимодействие с «железом», визуализация и др.;
  • Embarcadero C++ Builder - разработка кроссплатформенных приложений;
  • MPLAB X IDE - разработка кода для микроконтроллеров Microchip (ассемблер и С/С++);
  • Keil µVision - разработка кода для микроконтроллеров на базе ARM (ассемблер и С/С++);
  • Quartus - разработка кода для матриц ALTERA (Verilog и VHDL);
  • Web - сюда входит HTML, CSS, PHP, JavaSvript, SQL и др.

 

Аппаратное

Это про разработку алгоритмов работы для микроконтроллеров и ПЛИС, которые представляют собой программируемые микросхемы с энергонезависимой структурой. Собственно, процесс изменения этой структуры в угоду требованиям технического задания и называется аппаратным программированием.

Упомянутая «энергонезависимая структура» состоит из различных полупроводниковых элементов, одни из которых отвечают непосредственно за обработку сигналов на выводах микросхемы (далее - внешняя периферия), а остальные - это внутренняя периферия. Теперь практический опыт по каждой из них.

Внутренняя периферия - настройка модулей генератора и фазовой автоподстройки частоты (PLL), работа с контроллером прямого доступа к памяти (DMA), применение сторожевого таймера (Watchdog), динамическое конфигурирование контроллера прерываний (IVT, основная/альтернативная таблицы. приоритеты), управление модулем выбора периферийных контактов (PPS), чтение/запись внутренней памяти (FLASH, RAM, EEPROM), запуск модуля вычисления контрольной суммы (CRC), активация режимов пониженного энергопотребления (Sleep, Idle, Doze), использование 8-/16-/32-х разрядных таймеров с тактовым сигналом от внутренних и внешних источников, а также модули захвата/сравнения (CCP), конфигурируемые логические ячейки (CLC), контроль низкого/высокого напряжения (HLVD), сброс при понижении напряжения питания и др.

Внешняя периферия - работа с аналого-цифровыми (ADC) и цифро-аналоговыми (DAC) преобразователями, управление двигателями через модули широтно-импульсной модуляции (PWM) в режимах одиночный + полумост + мост, взаимодействие на базе модуля асинхронного приёмо-передатчика (USART, LIN, RS232, RS485), формирование внутрисхемной связи (SPI, I2C, I2S), взаимодействие с внешними устройствами на базе промышленных протоколов (CAN FD, Ethernet, USB).

Типовая задача состоит в сборе данных с разнотипных устройств (промышленные контроллеры, детекторы с цифровым или аналоговым выходом, беспроводные модули), в режиме реального времени отображение информации на индикаторе (при его наличии) и запись обработанных данных на SD-карту, отправка по стандартному протоколу или выдача управляющих команд для исполнительных механизмов.

 

Высокоуровневое

Технологический процесс - это про «жёсткое» реальное время, поэтому алгоритм управления оборудованием не всегда можно локализовать на одной печатной плате, то есть часть функций выводится в родительскую систему или возлагается на оператора. В последнем случае приходится разрабатывать программное обеспечение с целью предоставить канал взаимодействия с моим «железом» для восполнения «недостающих» функций управления. По умолчанию (если нет возражений со стороны заказчика) для разработки использую Embarcadero C++ Builder, но возможны варианты.

Применяю: многопотоковое программирование (класс TThread, синхронизация, критические секции, mutex, семафоры, сообщения Windows), функции API Windows, стандарт COM+, фильтры и обработчики исключений (try, catch), динамическое распределение памяти (malloc, free), файловый ввод-вывод, работа с локальными базами данных и базами данных из сети, создание и динамическое подключение DLL, классы, структуры, указатели, потоки, а также создание графического интерфейса пользователя, консольных и терминальных приложений.

Умею: обеспечить двухстороннюю связь через COM порт (аппаратный или виртуальный), прочитать-записать Report для устройства класса USB-HID, создать в оперативной памяти компьютера карту всех регистров микроконтроллера и обновлять её в режиме реального времени (очень полезно для отладки «железа»), обеспечить обмен данными со своим устройством по TCP-IP (создание Socket, Session и др.), работать с LPT, осуществить захват видеопотока.

 

Web

Иное программное обеспечение или интерпретаторы команд, использующие производные компилятора С/С++, а также языки разметки и прочие «ништяки» никаких трудностей не вызывают, но в основном используются с целью создания надстроек для своих устройств. Например, для создания TCP-socket на микроконтроллере (web «морда») нужно знать XML, HTML, CSS и JAVA. Претензий на абсолютные знания по этим инструментам у меня нет, но «нацарапать» несколько html-страниц с динамическим обновлением контента (технология AJAX, но без jQuery - исключительно на XMLHttpRequest) не «вываливаясь» из внутренней памяти микроконтроллера - задача вполне себе штатная.

Системы управления базами данных (SQL, структурированный язык запросов) периодически применяются в моих разработках в качестве переходного звена между индексированными таблицами и сигналами датчиков. Всё предельно лаконично: запрос - получил данные, обработал, запрос - записал в базу и забыл, а уже заказчик сам занимается оптимизацией производительности, обеспечением совместного доступа, свойствами + атрибутами таблиц и др.

 

Литература

Здесь представлены книги, составляющие основу моего академического фундамента по программированию. В список намеренно не включены прикладные труды (научно-популярные статьи, спецификации, журналы и др.), так как «Знание принципов легко возмещает незнание фактов»(C).

Книги представлены исключительно в ознакомительных целях - любое использование этой литературы кроме предварительного ознакомления запрещено. Если Вы являетесь правообладателем одной из них и считаете, что подобная реклама Ваших трудов не приемлема - прошу связаться со мной одним из вариантов.

  1. Архангельский А.Я. Программирование в C++ Builder 6.
  2. Орвик П. Windows Driver Foundation: разработка драйверов.
  3. Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений.
  4. Руссинович М. Внутреннее устройство Microsoft Windows.
  5. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования.