
Фото: 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).
Книги представлены исключительно в ознакомительных целях - любое использование этой литературы кроме предварительного ознакомления запрещено. Если Вы являетесь правообладателем одной из них и считаете, что подобная реклама Ваших трудов не приемлема - прошу связаться со мной одним из вариантов.
- Архангельский А.Я. Программирование в C++ Builder 6.
- Орвик П. Windows Driver Foundation: разработка драйверов.
- Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений.
- Руссинович М. Внутреннее устройство Microsoft Windows.
- Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования.













