USB-polygon-21: Окончание
Причесывание кода
Напоследок решил привести код подпроектов к какому-то единому стилю. По крайней мере, попытаться, хотя бы в некоторых моментах.
Для начала заменил табы на пробелы. Хотя я вполне согласен с мнением, что отступы — пустое место от начала строки до первых печатаемых символов — логично делать табами (для чего они и придуманы), а выравнивание (например, чтобы комментарии к строкам разной длины начинались с одной колонки) — пробелами. Однако, у такого решения есть свои минусы.
Во-первых, при сильно различающихся значениях табуляции (от 2 до 8) на разных машинах выравнивание пробелами все равно разъезжается безобразно. То есть, если на одной машине с табом в 2 пробела на строках с разным уровнем вложенности сделать выравнивание комментариев пробелами, то на другой машине с табом в 8 пробелов комментарии не будут выровнены. А время от времени приходится работать на разных машинах, в том числе, чужих, где правка настроек не приветствуется.
Во-вторых, ряд IDE и рекомендаций по стилю (например, Qt) требуют использования пробелов и неиспользования табов. При активном применении того же Qt Creator имеет смысл привыкать к стилю, используемому там по умолчанию.
В-третьих, сталкивался уже с чужим кодом, в связи с необходимостью его сопровождения или полного переписывания, где табы с пробелами были чудовищно перемешаны в произвольном порядке и последовательности. Это способствовало тому, что код было тяжело читать даже на той машине, на которой его писали, а при переносе в другую среду/редактор все расплывалось ужасно.
В общем, самый простой способ решения этих вопросов — использование пробелов вместо табов и замена табов на пробелы с последующим переформатированием отступов и выравнивания.
Далее отформатировал отступы, оформив соответствующую глубину вложенности для циклов, проверок условия и тому подобных блочных конструкций.
Затем навставлял переносов строки, ограничивая длину строк до 80 символов. Это удобно даже на современных широких экранах, чтобы не «бегать» глазами по всей ширине монитора. Кроме того, у меня редко используется окно среды или редактора во весь экран, а чаще занимает от силы половину по ширине. Опять же, периодически пользуюсь нетбуком в качестве рабочей станции. Короче, эта рекомендация во многих требованиях к стилю сохранилась до сих пор неспроста.
Еще исправил первые скобки функций так, чтобы открывающая код функции скобка была прижата к левому краю строки, а не заканчивала строку с названием функции, в отличие от скобок при условиях, циклах и прочих подобных блоках, где чаще рекомендуется «египетский» стиль. Это требование тоже присутствует во многих стилевых рекомендациях, и его выполнение повышает удобство работы в редакторах, в которых анализ текста синтаксический, а не семантический. Например, VIM ищет начало и конец функции по открывающей и закрывающей скобке именно в начале строки.
Ну, и поудалял закомментированный неиспользуемый код. Если придется закрытые строки все-таки использовать, можно откатить изменения в git, в конце концов, это одна из его функций.
Результаты
Итак, в процессе работы над хобби-проектом были достигнуты следующие результаты:
- Создана простая цифровая электрическая принципиальная схема, впоследствии на практике проверена ее работоспособность;
- Освоена (пусть на любительском уровне) среда KiCAD, бесплатная, кроссплатформенная и более чем достаточная для любительского проектирования;
- Разведена в электронном виде и далее создана в натуре печатная плата;
- Создано работоспособное устройство на базе микроконтроллера;
- Освоен информационный обмен между микроконтроллерным устройством и компьютером по USB;
- Разобраны тонкости организации памяти запоминающих устройств с файловой системой;
- Освоена работа контроллера с некоторыми периферийными устройствами с использованием как портов в обычном режиме напрямую, так и SPI-порта;
- Отлажена работа с экраном от мобильника, что позволяет использовать его в качестве устройства индикации с возможностями гораздо более широкими, чем, скажем, у светодиодной линейки
- Отлажена работа с внешней флэш-памятью, что позволяет расширить память хранимых данных;
- Отлажена работа с энкодером — очень удобным и довольно универсальным устройством ввода;
- Получено расширяемое за счет программирования и подпайки к портам устройство, которое можно применить как для отладки алгоритмов, так и для реальной работы в каких-то самодельных приборах;
- Цена окончательного варианта с учетом использования запчастей от неисправной техники около 200 р. на момент создания, из которых 198 р. — контроллер;
- Требования ТЗ, сформулированного в первом опусе цикла, выполнены.
Единственное, что не было сделано — не был освоен ассемблер AVR. Но настоятельной необходимости в нем не возникло ни разу. Во-первых, основная используемая библиотека — LUFA — написана на С. Во-вторых, с USB на голом ассемблере вообще работать не очень-то просто из-за обилия всякого рода структур, которые есть готовые на С, и из-за наличия готовых кусков кода на С, позволяющих не изобретать свои велосипеды. В-третьих, в данном учебном проекте не требовалось серьезной оптимизации ни по коду, ни по быстродействию. В общем, вполне достаточно возможностей языка С.
Выводы
Если есть желание с нуля создать собственный проект на базе микроконтроллера, но нет опыта, мало инструмента и вообще страшновато, то бояться не надо: это несложно, недорого и довольно интересно.
Заготовка любительского проекта имеет нехилый потенциал за счет гибкости, обеспечиваемой программируемостью. Из одной и той же платы можно сделать довольно много чего, меняя всего лишь программу. Эх, добавить бы в схему еще и ПЛИС рублей тоже за 200…
Описываемое устройство уже было использовано в работе в качестве управляемого SPI-master для отладки разрабатываемого прибора, имеющего SPI-slave. Так что, хобби – не хобби, а может пригодиться не только в любительских целях.
Подобный проект для саморазвития полезнее ардуиностроения в разы. Он требует инженерного подхода к каждому шагу, начиная с подбора элементной базы и выбора программного обеспечения для проектирования и отладки. Он не привязывает к ограниченному набору лего-кирпичей (как аппаратных, так и программных), а приучает создавать устройство на совсем другом уровне. Такой подход позволяет исходить из решаемой задачи, подгоняя под результат размеры и форму устройства, используемое питание и все такое прочее. Кроме того, можно использовать для работы практически все, что есть под рукой, что при сборке ардуино-устройств тоже в принципе отчасти возможно, но несколько затруднительно. Опять же, можно существенно ужаться по бюджету, что может быть немаловажно для хобби-проектов, не только студенческих, но и в том возрасте, когда надо выбирать: купить игрушку себе или своему ребенку. Ардуино будет подороже, а игрушка ребенку — поважнее.
А то, что проект занял у меня больше года — это не показатель сложности, на самом деле. Просто работа над ним велась в очень свободное время — в те часы, которые не занимала работа, домашнее хозяйство, семья, друзья и активный отдых. А таких часов было за прошедшие несколько лет очень и очень немного. Если заниматься каждый вечер, да еще прихватывать выходные, то вполне можно было бы уложиться и в месяц – два.