|
Играем в кубики по взрослому или Как научиться быстро писать программы на микроконтроллерах |
Заказчики программного обеспечения постоянно мечтают о том, чтобы программы
создавались мгновенно и работали так же надёжно, как устройства на логических элементах. Я пережил уже несколько
ярких преобразований в программировании, и каждая новая программная
среда преподносилось как идеальное решение. Но, как и всегда было
и, думаю, еще очень долго будет, каждая новая идея приносит новые глюки и проблемы. К примеру, у всех на виду
перипетии с ОС Била
Гейтса. Описывать их нет смысла, в Интернете этого много, а
моя статья о другом. Я хочу проанализировать и вынести на
обсуждение, насколько быстро и надежно можно писать программы для
микроконтроллеров, используя тот инструментарий, который оптимально
можно использовать в данный момент времени. |
||
Вообще переход от алгоритма к программированию представляет определённую проблему. Тут получается следующее: любая задача может быть решена несколькими алгоритмами, а каждый алгоритм неоднозначно реализуется одним программистом в разное время суток и зависит от скорости ветра в коридоре. И получается, что от ветра тоже зависит скорость работы программы и её качественные показатели. То есть преобразование решения задачи и даже алгоритма в коды, понятные MPU каждый программист проделывает по своему, в зависимости от интеллекта и знания языка программирования. Поэтому принято считать программирование все таки искусством и затраты времени и средств, выделяемых на проект, находятся в прямой зависимости от способностей программиста. Поиск эффективного алгоритма и его реализация - задача творческая, и автоматизировать не получается. Сейчас развивается подход к разработке программного обеспечения, названный «автоматным программированием», которое можно рассматривать в качестве разновидности синхронного программирования. Предлагаемая концепция проектирования позволяет описывать процессы, которые необходимо автоматизировать, используя при этом понятный всем формальный язык конечных автоматов. И еще: вне зависимости от методов разработки у любой программы есть состояния, в каждый момент времени определяемые значениями всех её переменных. Тогда изменение значения одной из управляющих переменных будет означать изменение состояния программы, а число состояний программы будет определяться максимально возможным количеством комбинаций значений управляющих переменных, возникающим при её работе. Если предположить, что в программе используются только двоичные управляющие переменные (флаги), то в этом случае количество состояний будет стремиться к 2n. Поэтому нет никакой гарантии, что в процессе работы программы не возникнет неожиданное сочетание входных воздействий, вследствие чего программа перейдёт в непредсказуемое состояние. |
||
Как избежать непредсказуемых состояний, быстро написать программу и иметь возможность ее модифицировать? А для этого надо иметь в своём арсенале готовые и тщательно отлаженные программные кусочки кода, подпрограммы, макросы и т.д. то, что я называю «кубики». Идея использовать кубики появилась когда программных модулей накопилось много, и я понял, что написание следующей программы сводится к переписыванию и повторению как минимум 50% уже когда-то выполненной работы. Поэтому идея «кубиков» была воспринята как естественное решение проблемы. Под «кубиками» будем понимать тщательно отлаженные программные модули, имеющие жесткие адреса для своих меток и данных. Частично здесь я отвечаю на вопрос: Почему я делаю системы на 2 и более процессорах? Ведь даже половины или четверти ресурсов одного процессора с головой будет достаточно для выполнения этих задач и более. Все просто. Поскольку большинство приборов выпускается малыми сериями, а некоторые даже не более 3-х, то самый примитивный экономический расчет покажет целесообразность такого подхода. Я бы назвал это назвал игрой в электронные кубики. Если позволяет место, то количество микропроцессоров можно увеличивать до, казалось бы, неразумного предела. Теперь на пальцах. Допустим, стоит задача: изготовление устройства регулирования температуры от 10 датчиков, меняющие пороги и данные, 10-ПИД регуляторов, и в течение суток выводящая информацию на светодиоды, меняющие яркость в зависимости от температуры по принципу шим модулятора. При превышении или понижении температуры светодиоды меняют яркость и переходе порога мигают с частотой тем частой, чем больше реальная температура отличается от температуры установки. Порог температуры всех уровней (индивидуально установленная) одновременно меняется одним потенциометром. Данные температуры интегрируются и записываются в память 24с65 каждую минуту. При этом пороги и другие установки системы программируется извне и отсылаются данные по 485 протоколу назад по запросу. В принципе задачу можно реализовать на PIC16F877. ресурсов хватит, 8К ПЗУ, 368 ОЗУ, 20 МГЦ. Почти Каждый алгоритм детский: опрос датчиков DS1821, прерывание от таймера для часов, умножения, сложения, ШИМы, опрос аналового входа, процедуры 24с65, прерывания от 485, вычисления ПИД регулятора. Все просто, но есть несколько но. Первое память. Раз это не войдет в 2к ПЗУ и один банк ОЗУ, значит принесет кучу головной боли. Несмотря на все старания будет несколько мест в программе которые вымотают все нервы. Компиляторы не находят ошибки при переходе из банка в банк. Не поможет ни эмулятор, ни симулятор. Да он вообще ни в чем не помогает, это не симулятор, а удобный текстовый процессор. Эмулятор помогает, но только как внутрисхемное быстрое программирование. Светодиоды с шим будут просто убийством. их нельзя выделить в процедуру, к которой можно периодически обращаться. Они не будут светиться, а будут противно мигать. Прерывание не задействуешь, если его сделать часто, чтоб получит 256 градаций, все станет медленным редким, светодиод будут мигать. Значит все процедуры придется впихивать в паузы между светодиодами, разбив их на куски. Куски программ, банки, куча дополнительных операторов типа установки PCLACH, прерывание от таймера, от 485 и получится такой пирог при отладке, что долбаться придется не одну неделю. Имеет смысл, если изделие предполагается выпускать тоннами или заказчик "пушистый", и ему плевать, сколько стоит работа. А текст набивать в любом случае. А теперь вариант «кубиков». Все MPU общаются между собой по USART. MPU N1: опрос датчиков DS1821 и отправка в MPU N2 и MPU3. MPU N2: вывод яркости на светодиоды. прием порогов от MPU N4. MPU N3: обработка ПИД и отправка в MPU N4. MPU N4: работа с памятью 24с64, часы и фэдер. MPU N5: синхронная или I2C связь с MPU N4 и работа с 485. теперь видно что на каждый процессор достаточно одного дня, мах двух, и система готова, и это в случае первого изготовления. экономия времени мин неделю при небольшом изменении подобной системы достаточно добавить еще недостающий кубик и все. Я здесь молчу о возможных незамеченных ошибках, которые по закону Мерфи выявятся через неделю, когда устройство уже должно пахать как лошадь. В кубике ошибка будет один раз, потом можно не думать, а контролировать с помощью потокового дисплея (по USART) очень легко. (См здесь) А когда разных кубиков станет 20, отладка станет анахронизмом и Вам останется только подправлять кубики для конкретного проекта. К примеру: пришел заказчик и желает добавить 2 дисплея 1602 для вывода всех температур до и после ПИД регулятора и блок с реле (а на фига тогда ПИД регулятор?). А попробуйте впихнуть теперь два дисплея и 10 реле в проект на 877. Крыша поедет. Нужно будет ставить что-то типа PIC18с452 и начинать все сначала. Экономический расклад: один PIC16F877 стоит около 200р, а 5 процессоров типа PIC16F628 стоят 300р разница = 100р если устройств 1-10, то даже и думать не надо. 100 и ли даже 1000р не стоит недели работы. В принципе подобную технологию я применяю и для однопроцессорных устройств. Процедуры обслуживания выполнены в виде отдельных файлов и при компиляции я только вписываю их в основной листинг. Когда нахожу ошибку или недоработку, она исправляется в этом проекте и не появляется в следующих разработках, тем более, что основные проблемы не с основным алгоритмом, а с кирпичиками системы. Применимо к данному случаю это: опрос датчиков, работа с памятью, часы, алгоритм прерывания, умножение и ПИД регулятор. Итог: не нужен мощный отладчик, минимум ошибок и возможных глюков в будущем, быстрое написание программы, надежность, возможность быстрой модификации. |
||
|
musidora@rambler.ru |
Последнее обновление
09.08.2009
|
Инженер и веб-мастер Богданов Андрей Александрович
Water LAB © |