Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #129


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 129.  20 декабря 2011 г.

Здравствуйте, уважаемые читатели!



На недавно опубликованную у нас статью нашего автора Dale другой наш не менее уважаемый Dimka написал критический отзыв. Это довольно отъемный текст и мы оформили его в виде статьи. Фрагмент можно прочитать здесь. Тем временем Dale начал новую серию: предлагаем вам здесь фрагмент статьи «Многозадачность во встроенном приложении. Часть 1».



Приятного чтения! Прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


Оглавление



Введение


В статье «Hello World!» в embedded-исполнении мы познакомились с методикой создания надежных приложений для встроенных систем на основе микроконтроллеров. Впрочем, в качестве иллюстрации был взят примитивнейший пример, чтобы сложность решения задачи не отвлекала от освоения инструментов (как и положено программам уровня «Hello World!»). В результате спроектированная нами система выполняет простейшую задачу, которую мог бы решить даже посетитель школьного радиокружка при помощи обычного мультивибратора за несколько минут и при затратах на пару порядков меньше.

Дело тут даже не в том, что мы «выстрелили из пушки по воробьям». В конце концов, даже дорога в тысячу ли, как известно, начинается с одного шага. Самое плохое здесь — то, что все вычислительные ресурсы без остатка расходуются на одну-единственную задачу, как бы проста она ни была, и не позволяют делать что-либо еще. Даже если мы увеличим тактовую частоту нашего процессора в 10 или 100 раз, это ни на что не повлияет. Система получилась совершенно нерасширяемой: к ней невозможно добавить новые функции, поскольку ресурсов для их выполнения уже не остается.

Причина этой нерасширяемости лежит на поверхности: если мы посмотрим исходный код модуля Timer, который ответственен за формирования временных интервалов включения и выключения светодиодного индикатора, то увидим, что эти интервалы формируются процессором в пустом цикле. Зная тактовую частоту и время выполнения одного цикла, можно рассчитать, сколько таких циклов следует выполнить, чтобы обеспечить заданную задержку.

Напомню, что функция главного цикла приложения сейчас выглядит так:


Код: (C)
void Application_run(void)
{
    Led_on();
    Timer_wait(500);
    Led_off();
    Timer_wait(1500);
}

На что расходуются вычислительные ресурсы контроллера? Мы ранее уже выяснили, как выглядит машинный код функции Led_on():


Код:
0000009a <Led_on>:
  9a: a8 98       cbi 0x15, 0 ; 21
  9c: 08 95       ret

Инструкция cbi выполняется за 2 такта (это очевидно, т.к. требуется один такт, чтобы считать текущее состояние регистра на АЛУ, и еще один, чтобы записать результат с установленным битом обратно в регистр). Инструкция ret выполняется за 4 такта. Столько же тактов нужно, чтобы вызвать функцию. Итого выполнение Led_on() вместе с вызовом длится 10 тактов, что при тактовой частоте 16 МГц составляет 10/(16*106) = 0.625 мкс. Ровно столько же длится выполнение Led_off(), которая очень мало отличается от Led_on(). В сумме наш процессор за один цикл выполняет полезную работу в течение 1.25 мкс. Если учесть, что весь цикл длится 2 секунды, получаем КПД нашего устройства 0.0000625%. Прямо скажем, не очень высокий показатель.

Очевидно, что, чтобы иметь возможность заставить процессор выполнять больше полезной работы в течение цикла, следует разгрузить его от совершенно непродуктивного накручивания холостых циклов в качестве средства отмеривания временных интервалов. Для этой цели в состав микроконтроллеров разработчики включают таймеры, количество и функциональные возможности которых зависят от модели. В частности, в состав нашего прототипа входит микроконтроллер ATmega16, который оснащен одним 16-разрядным и двумя 8-разрядными программируемыми таймерами-счетчиками. Эти таймеры способны отмерять заданные интервалы параллельно с работой центрального процессора, давая ему возможность выполнять в это же время другую работу, и генерировать прерывания по истечении этого интервала, тем самым делая ненужным постоянный опрос текущего значения счетчика реального времени.

Использование таймера — лишь необходимое, но не достаточное условие распределения вычислительных ресурсов процессора между несколькими задачами. Нам потребуется также изменить саму концепцию работы приложения в многозадачном режиме. Те, кто использует настольные компьютеры, используют для этого многопоточность, когда внутри одного приложения создается несколько потоков выполнения для разбиения задачи на подзадачи; при корректном применении многопоточности создается иллюзия параллельного выполнения всех потоков одновременно, несмотря на наличие небольшого числа процессоров (иногда он даже один, хотя одноядерные процессоры на ПК уходят в историю). Создается эта иллюзия за счет того, что процессор достаточно часто переключается между потоками (говорят, что процессорное время разбивается на кванты), и хотя в каждый определенный момент каждый из процессоров способен выполнять лишь один поток, за определенный период каждый из потоков получит свою долю квантов (точнее, получит возможность мспользовать свою долю, что, строго говоря, не одно и то же).

Для микроконтроллеров тоже существуют операционные системы, причем их выбор не так уж мал (от самых простейших, с ядром в несколько килобайт и самыми скромными возможностями, до встраиваемых версий Linux). Впрочем, запросы даже самой скромной ОС реального времени могут оказаться не по зубам микроконтроллерам начального уровня. Но это не является непреодолимым препятствием для реализации многопоточности даже в этом случае. Существуют решения, способные работать в самых спартанских условиях. Именно их мы и рассмотрим в данной статье.

Поскольку самый лучший способ чему-то научиться — это решить какую-то практическую задачу, мы так и поступим. Сначала поставим задачу, которая не решается (или весьма неэффективно решается) теми средствами, которыми мы уже владеем, а затем попробуем ее решить, попутно осваивая новые средства.


...



Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».


По мере знакомства с работой «Hello world в embedded исполнении», ощущение противоречивости моих собственных впечатлений возрастало с каждой частью. Наконец, оно превысило тот порог, за которым ещё можно хранить молчание, посчитав некоторые нестыковки мелочами. Пусть не обессудит автор, но длина обсуждаемой работы оказала значительное влияние на развёрнутость отзыва. Отзыв состоит из трёх частей: критического анализа подхода автора, моего предложения альтернативного подхода и некоторых размышлений о взаимодополнении обоих подходов.


1. Критический анализ


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


1.1. Роль индивидуальности


Вообще этот (я бы даже сказал деликатный) вопрос не очень уместен при обсуждении текстов технической тематики. Однако автор не стал себя ограничивать сухим, чётким и лаконичным техническим языком. С одной стороны, живость слога всегда украшает литературное творчество, за что стоит поблагодарить автора. Но с другой стороны, именно лирические отступления в тексте превращают сугубо техническую статью в литературное произведение несколько иного жанра. У автора, на мой взгляд, вышла повесть дидактического характера с элементами панегирика самому себе.

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

Излагаемый автором метод достигает своего дидактического апофеоза в пятой части его работы.


...



Полностью прочитать отзыв можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».



В избранное