Программинг микроконтроллеров

индекс
180,37

Восьмиядерная сороконожка

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

Компания Parallax не обладает такой известностью, как Atmel, Microchip, ARM, Intel и другие, однако под ее началом производится микроконтроллер P8X32A, который сумел завоевать симпатии многих любителей электроники.

Микроконтроллер обладает следующими характеристиками:
  • Максимальная частота: 80MHz
  • Разрядность операндов: до 32 бит
  • Количество ядер: 8
  • Максимальная производительность: 160 MIPS (по 20 MIPS на ядро)
  • Количество приватной памяти на ядро: 2 кб (512 слов, реально меньше)
  • Количество разделяемой памяти: 32 кб RAM и 32 кб ROM.
  • Количество GPIO-выводов: 32
  • Напряжение питания: 3,3В
  • Упаковка: DIP-40, 44-pin LQFP или 44-pin QFN
  • Стоимость: $8 (США), 800 руб. (Россия)




Восемь ядер — впечатляет! Однако впечатляет не всех… Периодически, можно встретить
критические замечания по микроконтроллеру:

1. Производительность всего 20 MIPS на ядро.
2. Нет встроенной Flash-памяти.
3. Практически отсутсвует периферия в виде PWM, DAC, ADC, таймеров, отсутсвуют прерывания.

Несмотря на это, микроконтроллер образовал свое сообщество, которое вполне активно его использует.

Разгадка любви к этому устройству не видна на первый взгляд, но отркрывется при знакомстве с ним: задумка и смысл, краеугольный камень микроконтроллера — это простота!

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

Например, что дается вместо классического подхода с использованием прерываний? У нас есть много ядер. Можно любое из них задействовать, как реакцию на внешнее событие. Специальная команда приостановит исполнение ядра, пока входы не примут заданную конфигурацию.

Что делать при отсутствии таймеров? В замен дается глобальный 32-битный счетчик тактов, а так же по два дополнительных счетчика на каждое ядро с множеством режимов работы. С помощью дополнительных счетчиков можно реализовать и ШИМ, и ЦАП, и АЦП, и измерение частоты, и другие полезные вещи. После этого микроконтроллер уже не кажется голой игрушкой. Тем более, после ознакомления с поддержкой вывода видеосигнала.

Система команд состоит всего из 60 инструкций, а их бинарный формат сразу напоминает о мощных RISC-процессорах. Каждая инструкция имеет фиксированный размер 32 бита и единую форму. В определенных позициях заданы флаги условного исполнения инструкции, в зависимости от состояния двух процессорных флагов: Z (ноль) и C (перенос). Каждая инструкция имеет флаги сохранения результата. А так же указание на источник и приемник.



Первое быстрое знакомство с микроконтроллером вызвает, скорее, недоумение. Глубокое знакомство с микроконтроллером, скорее, поражает сочетанием простоты и заложенного потенциала.

Не это ли является золотой срединой между простотой и свободой творчества?



Ссылки по теме


1. Даташит на микроконтроллер, PropellerDatasheet-v1.2.pdf (англ.)

2. Переведенная на русский язык документация на микроконтроллер.

3. Руководство пользователя, WebPM-v1.1.pdf (англ.)

4. Наличие и цены готовых средств разработки, цены на чипы (Terraelectronica, Москва), используйте поиск по «P8X32A» и «Propeller».

5. Форум, посвященный микроконтроллеру (англ.)
+54
7 сентября 2010, 16:37
42

комментарии (43)

+3
TolTol #
Замечания и дополнения приветствуются! :)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+1
TolTol #
> что это за странная смесь бейсика и паскаля на скрине?

Скорее смесь Pascal и Python :)

Это высокоуровневый язык Spin, предлагаемый производителем, по аналогии с Wiring для Arduino.
Только он интерпретируемый и код интерпретатора зашит в ROM.
НЛО прилетело и опубликовало эту надпись здесь
+1
mikhanoid #
Вообще-то, как мне кажется, в Spin и заложен весь изюм этой разработки. 8 ядер как раз и возможны по той причине, что в Spin есть всякие формальные верификаторы кода, во многих случаях гарантируют отсутсвие косяков в протоколах и согласовании параллельных процессов. А Propeller — это простая железяка, обеспечивающая работу этих Spin-моделей.

Но вообще, да, согласен с Вами, что концепт такой архиинтересный. Если будете развивать тему, то про Spin не забудьте написать.
0
mikhanoid #
Да. Ну и всякие разные конструкции параллельные в Spin тоже есть. Типа там параллельных if-ов (которые do называются) и прочих прелестей.
0
Levsha100 #
+ Си.

А вообще очень интересная микруха, но мне arm-ы больше нравятся =)
0
maxvodo #
Странная, но офигительно — оформленная в плане комментирования исходных текстов
+1
fleshy #
Достаточно бестолковый контроллер. Периферии как таковой нет, все программно, многоядерность плюс, но кроме как перемалывать числа он по сути мало что умеет, а чисел в него особо много не засунешь — памяти не так много. + не умеет делить/умножать аппаратно + 4 такта на инструкцию, так что одно ядро работает только на 20 MIPS максимум. На 80 мгц лучше взять Cortex-M3 based что-то, LPC13xx или даже LPC17xx — гораздо вкуснее камни за те же деньги, а то и меньше
+2
TolTol #
> Достаточно бестолковый контроллер. Периферии как таковой нет, все программно

Видите, какой парадокс: «переферии нет», при этом на демоплате присутвуют:

EEPROM, подключенная по I2C
FT232, подключенная по COM
Видео-выходы
Разъем PS/2 для клавиатуры
Разъем PS/2 для мышки

> На 80 мгц лучше взять Cortex-M3 based что-то

Абсолютно не факт. Как было написано выше: «Он не хуже, он другой».
0
fleshy #
еепром присутствует ввиду отсутствия SRAM для хранения программмы. RS232 (который вы обозвалил совершенно несправедливо COMом) — насколько я помню эмулируется программно. Клавиатура и мышь — тоже программно. Вот насчет видео да, с видео он неплохо работал
0
TolTol #
> еепром присутствует ввиду отсутствия SRAM для хранения программмы

Имеется ввиду «отсутствие FLASH»? И там ключевое слово I2C :)

> RS232 (который вы обозвалил совершенно несправедливо COMом) — насколько я помню эмулируется программно

Так ведь это и задумано! Можно сделать несколько USART, с размером FIFO по килобайту :-)
0
fleshy #
ну я на самом деле и не отел сказать, что проц плохой. просто очень специфичный. если есть задача, куда он вписывается хорошо (например генерация видеосигнала), то почему бы его не применить. Кортексы, например, видятся мне более универсальными. Очень хочется с ними поиграться
+3
nehyrb #
Да, программная реализация протоколов — одна из его главных «фишек». Я на нем так делал вывод на 4(!) монитора! Но главное преимущество не в этом, а в том, что при программной реализации нет привязки к конкретному порту ввода-вывода, можно выбрать любой и упростить печатную плату. Этот подход вообще чем-то напоминает разработку на ПЛИС. :)
0
k0ldbl00d #
Вы уверены, что это RS232? Сбивает с толку количество контактов в разъеме — 15.
0
TolTol #
Этот транспорт между микросхемами (FT232 и P8X32A) и сделан в виде дорожек на плате, а 15-контактный разъем — это RBG-видео выход
+1
nehyrb #
Полностью соглашусь на счет бестолковости. Он довольно интересен архитектурно, в каких-то случаях даже можно приспособить под конкретную задачу, но в большинстве задач он проигрывает стандартным микроконтроллерам. При аналогичной стоимости (а то и меньше) можно взять Cortex M3, на котором уже будет аппаратно вся нужная периферия (да и USB/ethernet, к примеру, которые в программной реализации в пропеллер не впихнешь). Да и тупая производительность под сомнением, хоть и 32 бита, но отсутствие умножения и деления — вещь неблагодарная…

Ну а в заключение: невозможность нормального программирования на Си и отсутствие механизмов отладки в кристалле. Программирование на Spin, в принципе, удобно, но это же виртуальная машина! Для полной скорости требуется писать на ассемблере, а в этом удовольствия мало. Тем более там возникают серьезные ограничения по количеству памяти и кода на ядро. Это и вовсе делает его малопригодным.

Кстати, про Propeller 2ого поколения ничего не слышно?
0
TolTol #
> (да и USB/ethernet, к примеру, которые в программной реализации в пропеллер не впихнешь

USB-host, вроде, впихнули:

forums.parallax.com/showthread.php?t=121321

www.youtube.com/watch?v=xlXfVVQT6KM

+1
nehyrb #
Впихнуть-то впихнули… Но на сколько он хорошо работает, а главное сколько ресурсов кушает?
0
fleshy #
>>Кстати, про Propeller 2ого поколения ничего не слышно?
слышал только, что он будет. Будет до 120Мгц и 1 такт на инструкцию
0
energycsdx #
Знаком я с другой архитектурой — XMOS.
там по 4 потока на ядро и до 4 ядер на кристалле.
Но периферии ноль, все софтово, умудряются реализовать вплоть до Ethernet MAC.
Смысла от этого я не вижу, потоков много но их приходится отдавать под железо, из за этого большая частота, 400МHz, и энергопотребление соответствующее.
0
TeamOut #
> LPC17xx — гораздо вкуснее камни за те же деньги, а то и меньше

почти в 2 раза разница в цене!
P8X32A — 900++
LPC17xx — 300-400
а LPC13xx — меньше 200ру
0
TolTol #
А как насчет детерминизма и предсказуемости в работе упомянутых «конкурентов»?
Это тоже одна из фишек Пропеллера.
0
energycsdx #
детерменизм это больше к софту
железо имеет намного меньше число состояний и верифицировать его проще.
более менее уважаемые конторы всегда проводят кучу проверок своего железа
0
TolTol #
Когда приходится использовать кучу прерываний от разных устройств, детерминизм не может «длиться вечно». На каком-то временном масштабе от детерминизма в этом случае останется хаос.

Пример одной из задач:

Устройство должно со строгой периодичностью (например, кадые 0.1 мс) обеспечивать установку портов вывода в заданное состояние. Очередное состояние передается устройству по последовательному интерфейсу. В тоже время, требуется проводить оцифровку 6 аналоговых каналов и отдавать полученные данные по последовательному интерфейсу.

В данном случае есть источники прерываний: АЦП, прием символа, передача символа, таймер. Естественно, они могут влиять на время выполнения обработчиков прерываний. Если джиттер управляющего сигнала сильно не желателен, то это может создать проблемы.
Так же, при добавлении еще пары хотелок, ПО просто может быть сложно доработать с сохранением требований по времени срабатывания и надежности.
0
energycsdx #
первоначально рассматривались контроллеры.
работа любого нормальный контроллера детерминирована.
если инструкция сложить два регистра значит это и произойдет никак иначе.

задача указанная в примере лежит уже в области RTOS и тоже успешно решается.
0
TolTol #
Детерминизм-то бывает не только чисто функциональный, но и по времени выполнения!

Если время выполнения блока кода из пары команд может быть то ли 2 такта, то ли 100, то здесь нет детерминизма в смысле времени выполнения.

И RTOS эту конкретную задачу абсолютно не решает.

Во первых, применение RTOS абсолютно не означает, что мы можем кооперировать задачи со сколь угодно малыми требованиями к реакциям. Если требуемые времена меньше, чем предоставляет RTOS — то она не подходит.

Во вторых, даже если сравнивать «программную многозадачность» с «аппаратной», то понято, что с аппаратной работать проще при наличии строгих требований к отклику.
0
sam_reaper #
0
SCoon #
Стоимость: $8 (США), 800 руб. (Россия)

А где Вы его, простите, видели в России в розницу по 800 руб? Ниже 1300 нигде не попадался.
0
SCoon #
Вопрос получился двусмысленным. Уточняя: везде, где он РЕАЛЬНО был в наличии мне называли цену от 1300. В Terraelectronica он действительно в наличии?
0
TolTol #
А в статье стоит ссылка 5 на терраэлектронику, где продают по 789.56 руб., на складе ~100 штук разных.

Только ссылка плохо вставилась, постараюсь поправить…
0
TolTol #
Ссылку поправить не получается, придется убрать :)
НЛО прилетело и опубликовало эту надпись здесь
+1
amarao #
Стоимость: $8 (США), 800 руб. (Россия)

Судорожно пытаюсь понять, как это у нас курс бакса стал 100р… Даже если учесть 18% НДС.
0
TolTol #
А не надо пытаться понять. Надо просто посмотреть в прайс «у них» и «у нас».
0
amarao #
Да я не про прайсы, я про вселенскую несправедливость.
0
rimpoche #
>>С помощью дополнительных счетчиков можно реализовать и ШИМ, и ЦАП, и АЦП
Насчет ШИМ сомнений никаких нету, с большой натяжкой можно согласиться с ЦАП, а вот АЦП, простите, никак невозможно.
0
TolTol #
Для того, что бы понять, как такое возможно (реализация Sigma-Delta ADC), нужно ознакомиться с документом http://www.parallax.com/Portals/0/Downloads/appnt/prop/AN001-PropellerCountersv1.2.zip, стр. 18. Один из режимов счетчика здесь играет ключевую роль.

0
Sap_ru #
Какой-то велосипед.
Зачем свое ядро городить? Взяли бы какой-нибудь ARM по-проще (ARM7 16к ОЗУ 70МНz) на ядро. Одно из ядер имеет больше ОЗУ (64к) и FLASH (512к) и используется для загрузки кода в остальные ядра. Стоил бы такой чип ~1200...1500р. Что, конечно в полтора-два раза дороже, но MIPS'ов давал бы шесть раз больше, плюс, куча компиляторов и наработанного софта в подарок. Вот это была бы вещь.
0
TolTol #
> Зачем свое ядро городить?

Что бы сделать эффективную систему. Что бы иметь возможность применить другой подход к программированию.
0
Sap_ru #
Я же и говорю — велосипед. У всех существующих контроллеров и архитектур — Фатальный Недостаток.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.