Нарушая запреты. Опыт программирования. Часть 1

  Нарушая запреты. Опыт программирования микроконтроллеров. Часть 1.


      Вступление.
С написанием программ я столкнулся впервые в самый первый день учебы в институте. После экскурсии на ВЦ института с обозрением монстра ЕС1022, нас повели в зал, где стояли совсем небольшие ЭВМ. Самая маленькая была армянская Наири сл штекерным набором программ. После занятий я и составил простенький примерчик, который она просчитала. Потом был курс ассемблера IBM-360 и соответствующая книга. Потом - язык ПЛ-1. Некий монстр программирования, как тогда казалось. Курс системного программирования с примерами на ПЛ-1 - ничего не понятно. Какие-то задачки по экономики. Курс автоматизации проектирования с примерами на Бейсике. Окончил институт, с огромным желанием продолжать свои опыты по программированию, но не представляя как это надо делать. Так как специальность у меня "железо", то такое "образование" было нормой в то время.
Первым моим учителем в области программирования был Равиль Салимзянов, который мое сумбурное программирование попытался втиснуть в некоторые стандартные, общепринятые рамки. В то время имелось уже множество переводных книг по структурному программированию. Первая задача на которой я практиковался была задача по размещению микропрограмм в памяти для микропроцессоров семейства Intel-3000. Писал на ПЛ-1. Эвристическое программирование - ерунда полная. Какое-то время занимался разработкой программы для накопителя на ЦМД, подключаемого к мультиплексному каналу ЕС ЭВМ. Уволившись из института и переехав в другой город через какое-то время в КБ занимался вопросами ввода-вывода и другими в программах для клона LSI-11. Естественно, писали на ассемблере, в лучшем случае, макроассемблере. В это же время преподавал инженерные расчеты на Бейсике в институте.В 90-х годах сделал систему для обучения в школах на база микропроцессора Intel8080. Программированием для нее занимались другие люди. Было выпущено полу кустарно несколько классов, некоторые из которых проработали почти десяток лет. Писал драйверы для персоналок IBM для работы под ДОС. Писал программу для модернизации классов на Intel-8051. И все это был ассемблер. И никакого структурного программирования и структур, за исключением буферной обработки. Но к тому времени уже были переводные и отечественные книги по всем этим вопросам.
В 2000-х годах наступила эра микроконтроллеров. Впервые с ними я столкнулся при работе над ПО для вибраторов. Платы были реализованы на японском микроконтроллере М30624. Прототип программы, с которой все слизывалось, написан на СИ но человеком, который в программировании ничего не смыслил. По принципу, как вижу - так и пишу. Пришлось попотеть с этим человеком, т.к. работа нескольких программистов под его руководством, ничего не дала. Тогда нашли программиста, заплатили эму солидные деньги и он все переписал сам.
Это был опыт на тему, как не надо писать и как не надо организовывать работу.
Потом была разработка на базе этого микроконтроллера системы управления камерой для сушки древесины. 5 камер проработали около 10 лет. Все управлялось он компьютера через порты RS-232 с контроллерами на нижнем уровне М30624. На них же в последствие была реализована система управления образцовыми динамометрами, выпущенная в количестве не менее 100 штук и многое другое. Но система эта не дешевая и трудоемкая в изготовлении. Один микроконтроллер со 100 ножками чего стоит.Программирование на Си.
Потом были более дешевые системы на ATMega32 для школ и множество применений этого микроконтроллера для радиолюбительских нужд и в домашнем хозяйстве.
Последние несколько лет автор занимался вопросами метрологического обеспечения разрабатываемых предприятием средств измерений и стендов для испытаний материалов и изделий. Может поэтому, при разработке различных приборов для домашнего (и не только) применения его прежде всего интересовали вопросы точности, стабильности и достоверности измерений.
Анализ материалов по этим вопросам в доступных источниках показал, что если предлагается что-то заслуживающее внимание, то код программы, как правило, скрыт. Если же имеется код программы, то он тривиален, либо некорректен.
При выборе языка программирования для измерительных задач предпочтение отдадим языку Си, без какого-либо объяснения причин. Желающие сами могут привести множество причин для этого.
Первый пример - это разработка измерителя емкости электролитических конденсаторов. Когда автор много лет назад делал этот прибор, оказалось, что большинство подобных приборов построены на фильтровом методе, либо на методе измерения времени разряда конденсатора. Использовав метод измерения времени заряда конденсатора автор получил интересные результаты. Оказалось возможным выявлять неисправные конденсаторы, которые другими методами не выявляются или требуют применения громоздких приборов, применения измерителей ЭПС. Но об этом позже и не это главное. Кому будет интересна эта статья. Кто любит делать что-то своими руками, кому интересно знать как это устроено и работает, кто хотел бы сделать что-то быстро, без лишних затрат сил и средств. Предполагается, что имеется промышленная плата микроконтроллера, на компьютере установлена система разработки программного обеспечения, например
WinAVR, программатор PonyProg или подобный, плата-конструктор с собранной схемой, в качестве вывода - ЖКИ дисплей и кнопки для управления. Все это сейчас доступно и не дорого. Решать задачу начинаем с поиска аналогичных разработок. Анализируем найденное, проверяем при необходимости, убеждаемся, что это не то и начинаем писать собственную программу. Вот на этом этапе советы из данной статьи и будут не лишними.
  Какие же запреты по "правильному" (структурное, ООП программирование и др.) написанию программ для микроконтроллеров приходится нарушать?
1. Комментарии в программе - как можно меньше, только для глобальных переменных и структур и особо вывернутых алгоритмов. Все должно быть ясно из текста.
2.Имена переменных: переменные циклов через i,j,k; одиночный символ - c; указатель - p и далее буквы на что указывает. Все остальное - как можно короче и на английском!
3. Везде где хотите что-то преобразовать из принятого - структуры и указатели.
4. Как можно меньше макросов.
5. Библиотеки подключаем по мере необходимости.
6. С плавающей запятой стараемся не работать.
7. Преобразования на вывод числа пишем сами, не надеясь на встроенные средства.
8. Никаких вложенных if, только case (но без догмы).
9. Никаких автоматов.
10. Максимально используем аппаратуру и прерывания. Точные измерения можно провести и встроенными малоразрядными АЦП.
11. Не пользуемся всем, что шумит. Забудем про ШИМ.
12. Максимально используем документацию к системе и примеры программ в качестве прототипов.
13. Чем меньше кода мы напишем сами, тем лучше устройство будет работать. Но пиратством не занимаемся.
14. Функции имеют один вход и один выход. Процедуры и макросы служат в основном для управления аппаратурой.
15. Пишем максимально быстро, аппаратуру делаем максимально дешевой.
16. Программист микроконтроллера - это одиночка. Но с другими поделиться своими успехами тоже не грех.
17. Особо сложные места программы (логика, обработка структур) отлаживаем в какой-либо мощной системе, например,DJGPP. Аппаратуру отлаживаем вживую, без эмуляторов. Так быстрее, избавляемся от необъяснимых ошибок, да и ресурсов перепрограммирования микроконтроллера теперь хватает.
18. При длительном простое - усыпляем микроконтроллер, снижая тем самым энергопотребление (зеленая революция).
19. Не жалеем время на отладку программы уже в металле.

  Во второй части статьи познакомимся с примером использования этих принципов при проектировании измерителя емкости.


Рецензии
О, и я учился программировать на Наири. Да и сейчас программирую на достаточно архаичном языке, но Вы посмотрите, результаты какие - http://www.proza.ru/2016/12/29/1190 ни у кого такого нет. Пытался найти для этого проекта более современный язык, но всё оказалось менее удобным.
Дмитрий

Дмитрий Маштаков   04.08.2017 09:16     Заявить о нарушении