Контроллер Parallax Propeller выпускается довольно давно, однако проектов с его использованием пока не особо много. "Буржуи" что-то делают, а в бывшем СССР как-то не густо. А ведь этот чип во многом уникален.
Этот топик создаётся с целью дать начальную информацию по Propeller, а также обсудить возможные применения в нашем хобби. Здесь я сделаю небольшой обзор архитектуры и возможностей контроллера, а также его недостатков (коих немало). Кто заинтересуется - можно почитать мануал. Существует и перевод на русский язык, правда немного устаревший, сделанный ребятами из украинской Инженерной Группы 6-Lab.
Так в чём же уникальность Parallax Propeller? А в том, что в его состав входят 8 идентичных 32-разрядных процессоров! Тактовая частота может достигать 80 МГц. Большинство инструкций выполняются за 4 такта, что даёт до 20 MIPS. Умножим это на число процессоров - получим 160 MIPS. Неплохо, да?
Имеются 32 цифровых линии ввода-вывода. Каждая линия отдельно может использоваться как вход или выход.
С каждым процессором связаны 2 КиБ ОЗУ, организованного как 512 32-битных слов, и 2 таймера. Каждый таймер может использовать до 2 линий ввода-вывода (одна как вход, одна как выход). Процессор не может обращаться к ОЗУ, принадлежащему другому процессору.
Общее адресное пространство, к которому могут обращаться все процессоры, имеет размер 64 КиБ. Нижние 32 КиБ соответствуют ОЗУ, верхние 32 КиБ - ПЗУ. В ПЗУ содержатся различные таблицы, которые могут быть полезны при написании программ - знакогенератор (базовая латиница и набор символов Latin-1), таблицы синусов, логарифмов и антилогарифмов, а также начальный загрузчик и интерпретатор языка высокого уровня Spin.
Доступ к общему адресному пространству осуществляется с помощью специального устройства - концентратора (hub). Концентратор выделяет для каждого процессора "окно" длительностью 2 такта. Цикл работы концентратора равен 16 тактам. Инструкция, обращающаяся к общему адресному пространству выполняется от 7 до 22 тактов, в зависимости от того насколько отстоит момент начала выполнения инструкции от "окна", выделенного текущему процессору. Это гарантирует, что разные процессоры не смогут обращаться к одному и тому же адресу общей памяти одновременно. Концентратор также обеспечивает доступ к аппаратно реализованным мутексам, которых имеется 8 штук.
После сброса, запускается процессор №0, который выполняет программу начального загрузчика. Загрузчик в течение некоторого времени ожидает команды от компьютера через последовательный интерфейс. Таким образом, можно загрузить программу в ОЗУ или внешнее ПЗУ, подключённое к контроллеру, и потом запустить её. Если же команда от компьютера не поступила, загрузчик проверяет наличие внешнего ПЗУ. Если ПЗУ не обнаружено, контроллер останавливается. Иначе, содержимое внешнего ПЗУ копируется в ОЗУ, и начинается выполнение загруженной программы.
Для программирования Propeller используются 2 основных языка - Spin и Propeller Assembler. Spin является языком высокого уровня, интерпретатор которого содержится во внутреннем ПЗУ контроллера. После загрузки всегда выполняется программа на Spin, которая может, если необходимо, запустить ассемблерную программу. Для Propeller существует также компилятор C (разработка компании ImageCraft).
Отдельного внимания заслуживают таймеры-счётчики. Каждый таймер состоит из 2 регистров (не считая управляющих регистров) - регистр частоты и регистр фазы. При возникновении определённого условия, содержимое регистра частоты прибавляется к содержимому регистра фазы. Условия могут быть различными, например наличие определённого логического уровня на линии ввода/вывода, фронт или спад на линии ввода/вывода, равенство или неравенство логических уровней на 2 линиях ввода/вывода. Также, определённые состояния регистра фазы могут вызывать изменения состояния линии вывода. Всего существует 32 режима работы таймера. Многообразие режимов работы таймеров позволяет реализовать различные генераторы импульсов, счётчики, измерители частоты, периода, скважности, ШИМ-модуляторы, синтезаторы звука и т.п. Добавив всего 1 резистор и 2 конденсатора, можно реализовать дельта-сигма АЦП от 1220 SPS при разрешении 16 бит до 5000000 SPS при разрешении 4 бит. Существуют режимы таймеров, которые с соответствующей программной поддержкой позволяют генерировать видеосигнал.
Теперь о недостатках.
Первое, на что обратят внимание те, кто привык работать с микроконтроллерами - отсутствие устройств ввода-вывода. Ни привычных UART, ни SPI, ни I2C, ни АЦП. Интересно, что при начальной загрузке используются UART для общения с хостом и I2C для доступа к внешнему ПЗУ. Неужели эти интерфейсы реализованы в загрузчик программно? А если аппаратно - почему было не разрешить доступ к ним из пользовательской программы?
Второе - программа на ассемблере должна быть расположена в ОЗУ процессора, на котором она исполняется. Это значит, что ассемблерная программа не может быть длинней 1984 байт (старшие 64 байта используются для доступа к портам, таймерам и т.д.) - а это всего 496 команд. Причём в этих же 1984 байтах должны располагаться локальные переменные. Регистров процессора как таковых нет - их функции могут исполнять любые ячейки памяти, принадлежащей процессору.
Третье - непонятно, почему доступ к встроенному ПЗУ осуществляется через концентратор. С ОЗУ понятно, а вот из ПЗУ можно было чтение сделать напрямую.
Четвёртое - отсутствие стэка. При вызове подпрограммы модифицируется ячейка памяти, содержащая команду возврата (!). Это значит, что а) рекурсивные вызовы не поддерживаются и б) у подпрограммы может быть только одна точка выхода. Это относится только к программам на ассемблере. В программах на Spin стэк реализуется программно.
Несмотря на эти недостатки, чип всё же довольно интересный. На нём можно делать довольно продвинутые вещи. Например, игровая консоль Hydra. Или АМ-приёмник, состоящий из чипа Propeller, десятка внешних компонентов и пары десятков строк кода.
Добавлено спустя 31 минуту 21 секунду:
Тема про Propeller уже поднималась на форуме viewtopic.php?f=2&t=3231&hilit=propeller#p40804
Но энтузиазма не вызвала.