Parallax P8X32A Propeller — это многоядерный процессор с параллельной архитектурой микроконтроллера с восемью 32-битными ядрами центрального процессора (ЦП ) с сокращенным набором команд (RISC ). [1] [2] Представленный в 2006 году, он разработан и продается компанией Parallax, Inc.
Микроконтроллер Propeller, язык ассемблера Propeller и интерпретатор Spin были разработаны соучредителем и президентом Parallax Чипом Грейси. Язык программирования Spin и интегрированная среда разработки (IDE) Propeller Tool были разработаны Чипом Грейси и инженером-программистом Parallax Джеффом Мартином.
6 августа 2014 года Parallax Inc. выпустила все оборудование и инструменты Propeller 1 P8X32A как оборудование и программное обеспечение с открытым исходным кодом под лицензией GNU General Public License (GPL) 3.0. Это включало код Verilog , файлы языка описания оборудования верхнего уровня (HDL), интерпретатор Spin, инструменты программирования и компиляторы PropellerIDE и SimpleIDE. [3]
В 2020 году был выпущен Propeller 2 (P2X8C4M64P).
Каждое из восьми 32-битных ядер (называемых cog ) имеет центральный процессор (CPU), который имеет доступ к 512 32-битным длинным словам (2 КБ ) инструкций и данных. Самоизменяющийся код возможен и используется внутренне, например, когда загрузчик перезаписывает себя с помощью интерпретатора Spin. Подпрограммы в Spin (объектно-ориентированный высокоуровневый код) используют механизм вызова-возврата, требующий использования стека вызовов . Ассемблерный (PASM, низкоуровневый) код не нуждается в стеке вызовов. Доступ к общей памяти (32 КБ оперативной памяти (ОЗУ); 32 КБ постоянной памяти (ПЗУ)) контролируется с помощью циклического планирования внутренним контроллером компьютерной шины , называемым hub . Каждый cog также имеет доступ к двум выделенным аппаратным счетчикам и специальному видеогенератору для использования при генерации сигналов синхронизации для PAL , NTSC , VGA , управления сервомеханизмом и других. [4]
Propeller может тактироваться с помощью внутреннего, встроенного в чип генератора (обеспечивающего меньшее общее количество деталей, но жертвующего некоторой точностью и температурной стабильностью) или внешнего кварцевого генератора или керамического резонатора (обеспечивающего более высокую максимальную скорость с большей точностью при более высокой общей стоимости). Только внешний генератор может работать через встроенный в чип тактовый умножитель с фазовой автоподстройкой частоты (PLL) , который может быть установлен на 1x, 2x, 4x, 8x или 16x.
Как частота встроенного генератора (если используется), так и значение множителя PLL могут быть изменены во время выполнения. При правильном использовании это может повысить энергоэффективность; например, множитель PLL может быть уменьшен перед длительным ожиданием бездействия, необходимым для целей синхронизации, а затем увеличен после этого, заставляя процессор потреблять меньше энергии. Однако полезность этого метода ограничена ситуациями, когда никакой другой процессор не выполняет зависящий от времени код (или тщательно спроектирован для того, чтобы справиться с изменением), поскольку эффективная тактовая частота является общей для всех процессоров.
Эффективная тактовая частота варьируется от 32 кГц до 80 МГц (точные значения, доступные для динамического управления, зависят от используемой конфигурации, как описано выше). При работе на частоте 80 МГц фирменный интерпретируемый язык программирования Spin выполняет приблизительно 80 000 токенов инструкций в секунду на каждом ядре, что дает 8 раз по 80 000 для 640 000 высокоуровневых инструкций в секунду. Для выполнения большинства инструкций машинного языка требуется 4 такта, что дает 20 миллионов инструкций в секунду (MIPS) на процессор или 160 MIPS в общей сложности для 8-процессорного процессора Propeller.
Потребление энергии можно уменьшить, снизив тактовую частоту до необходимой, отключив ненужные процессоры (которые затем потребляют мало энергии) и перенастроив ненужные контакты ввода-вывода или те, которые могут быть безопасно переведены в состояние высокого импеданса ( тристатированные ) в качестве входов. Контакты можно перенастраивать динамически, но, опять же, изменение применяется ко всем процессорам, поэтому синхронизация важна для определенных конструкций. Некоторая защита доступна для ситуаций, когда одно ядро пытается использовать контакт в качестве выхода, а другое пытается использовать его в качестве входа; это объясняется в техническом справочном руководстве Parallax.
Каждый процессор имеет доступ к некоторому выделенному аппаратному обеспечению счетчика-таймера и специальному генератору сигналов синхронизации, предназначенному для упрощения проектирования каскадов вывода видео, таких как композитные дисплеи PAL или NTSC (включая модуляцию для вещания) и мониторы Video Graphics Array (VGA). Таким образом, Parallax делает доступным пример кода, который может генерировать видеосигналы (текст и несколько графику с низким разрешением), используя минимальное количество деталей, состоящее из Propeller, кварцевого генератора и нескольких резисторов для формирования грубого цифро-аналогового преобразователя (ЦАП). Частота генератора важна, так как корректирующая способность аппаратного обеспечения синхронизации видео ограничена тактовой частотой. Можно использовать несколько процессоров параллельно для генерации одного видеосигнала. В более общем смысле, аппаратное обеспечение синхронизации может использоваться для реализации различных сигналов синхронизации с широтно-импульсной модуляцией (ШИМ).
Помимо интерпретатора Spin и загрузчика , встроенное ПЗУ предоставляет некоторые данные, которые могут быть полезны для определенных звуковых, видео или математических приложений:
Математические расширения призваны помочь компенсировать отсутствие блока с плавающей точкой и более примитивных недостающих операций, таких как умножение и деление (это замаскировано в Spin, но является ограничением для процедур языка ассемблера ). Однако Propeller — это 32-битный процессор, и эти таблицы могут иметь недостаточную точность для более точного использования.
Spin — это многозадачный язык программирования высокого уровня , созданный Чипом Грейси из Parallax , который также разработал микроконтроллер Propeller , на котором он работает, для своей линейки микроконтроллеров Propeller. [5]
Spin-код написан на Propeller Tool, платформе разработки программного обеспечения с графическим интерфейсом, написанной для Windows XP. [6] Этот компилятор преобразует Spin-код в байт-коды , которые могут быть загружены (с помощью того же инструмента) в основную 32-килобайтную оперативную память и, при необходимости, в загрузочную электрически стираемую программируемую постоянную память ( EEPROM ) I²C чипа Propeller. После загрузки propeller интерпретатор байт-кода копируется из встроенного ПЗУ в 2-килобайтную оперативную память основного COG. Затем этот COG начнет интерпретировать байт-коды в основной 32-килобайтной оперативной памяти. В других COG может работать более одной копии интерпретатора байт-кода, поэтому одновременно могут работать несколько потоков кода Spin . В программе кода Spin можно вставить встроенную программу ассемблерного кода . Затем эти программы ассемблера будут работать в своих собственных COG.
Как и Python , Spin использует отступы вместо фигурных скобок или ключевых слов для разграничения блоков .
Интерпретатор Propeller для его собственного многопоточного языка программирования Spin является интерпретатором байт-кода . Этот интерпретатор декодирует строки инструкций, по одной инструкции на байт , из пользовательского кода, который был отредактирован, скомпилирован и загружен в Propeller из специализированной интегрированной среды разработки (IDE). Эта IDE, которую Parallax называет The Propeller tool , предназначена для использования в операционной системе Microsoft Windows .
Язык Spin — это язык программирования высокого уровня . Поскольку он интерпретируется в программном обеспечении, он работает медленнее, чем чистый ассемблер Propeller, но может быть более компактным: коды операций ассемблера Propeller имеют длину 32 бита; директивы Spin имеют длину 8 бит, за которыми может следовать ряд 8-битных байтов, указывающих, как работает эта директива. Spin также позволяет избежать существенных проблем сегментации памяти , которые необходимо учитывать для ассемблерного кода.
При запуске копия интерпретатора байт-кода (размером менее 2 КБ) будет скопирована в выделенную оперативную память Cog, а затем начнет интерпретировать байт-код в основной оперативной памяти объемом 32 КБ. Дополнительные Cog могут быть запущены с этой точки, загружая отдельную копию интерпретатора в выделенную оперативную память нового Cog (таким образом, одновременно могут работать восемь потоков интерпретатора). В частности, это означает, что по крайней мере минимальный объем кода запуска должен быть кодом Spin для всех приложений Propeller.
Синтаксис Spin можно разделить на блоки, которые содержат:
Пример программы (как она будет выглядеть в редакторе Propeller Tool ), которая выдает текущий системный счетчик каждые 3 000 000 циклов, а затем отключается другим процессором после 40 000 000 циклов:
Parallax Propeller постепенно накапливает программные библиотеки, которые дают ему возможности, аналогичные возможностям старого продукта Parallax BASIC Stamp ; однако единого списка того, какие возможности PBASIC теперь имеют эквиваленты Spin, не существует .
Было высказано шутливое мнение, что «если бы в баре встретились два языка — Fortran и BASIC, — то через девять месяцев один из них нашел бы Spin». Это относится к форматированию пробелов в FORTRAN и работе BASIC на основе ключевых слов.
Первоначальная версия чипа (называемая P8X32A) обеспечивает один 32-битный порт в 40-контактном 0,6-дюймовом двухрядном корпусе (DIP), 44-контактном LQFP или корпусе Quad Flat No-leads (QFN) с технологией поверхностного монтажа . Из 40 доступных контактов 32 используются для ввода-вывода, четыре для питания и заземления, два для внешнего кристалла (если используется), один для включения обнаружения отключения питания и понижения напряжения и один для сброса.
Все восемь ядер могут одновременно получить доступ к 32-битному порту (обозначенному как "A"; в настоящее время нет "B"). Специальный механизм управления используется для предотвращения конфликтов ввода-вывода, если одно ядро пытается использовать вывод ввода-вывода как выход, а другое пытается использовать его как вход. Любой из этих выводов может использоваться для методов синхронизации или широтно-импульсной модуляции, описанных выше.
Parallax заявила, что ожидает, что более поздние версии Propeller предложат больше контактов ввода-вывода и/или больше памяти. [7]
Разработчики Propeller спроектировали его вокруг концепции «виртуальных устройств ввода-вывода». Например, HYDRA Game Development Kit (компьютерная система, разработанная для любителей, чтобы научиться разрабатывать видеоигры в стиле ретро) использует встроенный генератор символов и логику поддержки видео для генерации виртуального графического процессора -генератора, который выводит цветные изображения VGA, цветные изображения, совместимые с PAL/NTSC, или транслирует RF-видео+аудио в программном обеспечении. [8]
Представленный здесь снимок экрана был сделан с помощью программного драйвера виртуального дисплея , который отправляет данные о пикселях по последовательному каналу на ПК. [9]
Доступны библиотеки программного обеспечения для реализации нескольких устройств ввода-вывода, начиная от простых UART и последовательных интерфейсов ввода-вывода, таких как SPI, I²C и PS/2-совместимые последовательные интерфейсы мыши и клавиатуры, драйверы двигателей для робототехнических систем, интерфейсы MIDI и контроллеры ЖК-дисплеев. [10]
Философия проектирования Propeller заключается в том, что многоядерная архитектура жесткого реального времени исключает необходимость в выделенном оборудовании прерываний и поддержке в сборке. В традиционной архитектуре ЦП внешние линии прерываний подаются на контроллер прерываний на кристалле и обслуживаются одной или несколькими процедурами обслуживания прерываний . Когда происходит прерывание, контроллер прерываний приостанавливает обычную обработку ЦП и сохраняет внутреннее состояние (обычно в стеке), затем направляет векторы в назначенную процедуру обслуживания прерываний. После обработки прерывания процедура обслуживания выполняет инструкцию возврата из прерывания , которая восстанавливает внутреннее состояние и возобновляет обработку ЦП.
Для оперативной обработки внешнего сигнала на Propeller любая из 32 линий ввода-вывода настраивается как вход. Затем процессор настраивается на ожидание перехода (положительного или отрицательного фронта) на этом входе с использованием одной из двух схем счетчика, доступных каждому процессору. Ожидая сигнала, процессор работает в режиме низкого энергопотребления, по сути, в спящем режиме. Расширяя эту технику, Propeller можно настроить на реагирование на восемь независимых линий прерывания с практически нулевой задержкой обработки. В качестве альтернативы можно использовать одну линию для сигнализации прерывания, а затем можно считывать дополнительные линии ввода для определения характера события. На код, работающий в других ядрах, процессор обработки прерываний не влияет. В отличие от традиционной архитектуры многозадачных однопроцессорных прерываний, синхронизация ответа на сигнал остается предсказуемой [11], и действительно использование термина прерывание в этом контексте может вызвать путаницу, поскольку эту функцию правильнее рассматривать как опрос с нулевым временем цикла.
При включении питания, обнаружении отключения питания , программном сбросе или внешнем аппаратном сбросе Propeller загрузит загрузочную процедуру машинного кода из внутреннего ПЗУ в ОЗУ своего первого (основного) процессора и выполнит ее. Этот код программно эмулирует интерфейс I²C , временно используя два контакта ввода/вывода для необходимых последовательных тактовых сигналов и сигналов данных для загрузки пользовательского кода из внешнего I 2 C EEPROM .
Одновременно он эмулирует последовательный порт , используя два других контакта ввода/вывода, которые могут использоваться для загрузки программного обеспечения непосредственно в ОЗУ (и, опционально, во внешнюю EEPROM). Если Propeller не видит команд из последовательного порта, он загружает пользовательскую программу (код входа которой должен быть записан в Spin, как описано выше) из последовательной EEPROM в основную 32 КБ ОЗУ. После этого он загружает интерпретатор Spin из своего встроенного ПЗУ в выделенную ОЗУ своего первого процессора, перезаписывая большую часть загрузчика.
Независимо от того, как загружена пользовательская программа, выполнение начинается с интерпретации начального пользовательского байт-кода с помощью интерпретатора Spin, работающего в первичном процессоре. После запуска этого начального кода Spin приложение может включить любой неиспользуемый процессор, чтобы запустить новый поток и/или запустить процедуры на языке ассемблера .
Propeller загружается с внешнего последовательного EEPROM ; после завершения последовательности загрузки к этому устройству можно получить доступ как к внешнему периферийному устройству. [12]
Помимо Spin и низкоуровневого ассемблера Propeller, на него были портированы и другие языки.
Parallax поддерживает Propeller-GCC, который является портом компилятора GNU Compiler Collection (GCC) для языков программирования C и C++ , для Propeller [13] (ветка release_1_0). Компилятор C и библиотека C соответствуют ANSI C. Компилятор C++ соответствует ANSI-C99. Полный C++ поддерживается с внешней памятью. Программа SimpleIDE [14] предоставляет пользователям простой способ писать программы без необходимости создания make-файлов . В 2013 году Parallax включила Propeller-GCC и Simple Libraries в серию учебных пособий Propeller-C Learn. [15] Propeller-GCC активно поддерживается. Propeller-GCC и SimpleIDE являются официально поддерживаемыми программными продуктами Parallax.
Компилятор ImageCraft ICCV7 для Propeller C был помечен как имеющий статус «срок годности истек». [16]
Доступен бесплатный компилятор ANSI C под названием Catalina. [17] Он основан на LCC . Catalina активно поддерживается.
PropBASIC — это язык программирования BASIC для микроконтроллера Parallax Propeller. [18] PropBASIC требует Brad's Spin Tool (BST), кроссплатформенный набор инструментов для разработки с Parallax Propeller. По состоянию на август 2015 года BST работает на i386-linux-gtk2, PowerPC-darwin ( Mac OS X 10.4–10.6), i386-darwin (Mac OS X 10.4–10.6) и i386-Win32 ( Windows 95 – Windows 7 ).
Для Propeller доступно по крайней мере шесть различных версий Forth , как коммерческих , так и с открытым исходным кодом .
Бесплатная версия, которая пользуется обширной разработкой и поддержкой сообщества, называется PropForth. [19] Она адаптирована к архитектуре prop и обязательно отклоняется от любого общего стандарта относительно архитектурной уникальности, что соответствует концепции Forth.
Помимо интерпретатора Forth, PropForth предоставляет множество функций, которые используют возможности чипа. Связанный ввод-вывод относится к методу связывания потока с процессом, позволяя одному процессу связываться со следующим на лету, прозрачно для приложения. Это может уменьшить или устранить необходимость в аппаратной отладке или интерфейсе JTAG во многих случаях. Многоканальный синхронный последовательный (MCS) относится к синхронной последовательной связи между чипами prop. 96-битные пакеты непрерывно отправляются между двумя процессорами, в результате чего приложения видят дополнительные ресурсы (+6 процессоров для каждого добавленного чипа prop) с небольшим или нулевым влиянием на пропускную способность для хорошо построенного приложения.
LogicAnalyzer относится к пакету расширений, реализующему программный логический анализатор. EEPROMfilesystem и SDfilesystem — это расширения, реализующие элементарное хранилище с использованием EEPROM и SD flash.
PagedAssembler относится к пакету оптимизаций, которые позволяют ассемблерным процедурам заменяться (и выходить из них путем перезаписи) на лету, что позволяет практически неограниченный размер приложения. Выполнение скрипта позволяет загружать расширения на лету, что позволяет исходному коду программы достигать размера носителя.
Ведутся работы по запуску виртуальной машины Java (JVM) на Propeller. Разрабатываются компилятор, отладчик и эмулятор. [20]
Большое подмножество Паскаля реализовано компилятором и интерпретатором на основе системы p-кодовой машины P4. [21]
Программируемый логический контроллер PICo (ПЛК, PICoPLC) поддерживает вывод на процессор Propeller. Программа создается в редакторе релейной логики с графическим интерфейсом пользователя , а полученный код выдается как источник Spin. PICoPLC также поддерживает P8X32 с функцией создания-симуляции-запуска. Нет ограничений на целевое оборудование, поскольку частота генератора и контакты ввода-вывода свободно настраиваются в редакторе релейной логики. Сайт разработчика PICoPLC ([1]).
По состоянию на 2014 год [обновлять]Parallax строит новый Propeller [22] с процессорами, каждый из которых будет работать со скоростью около 200 MIPS, тогда как процессоры текущего Propeller работают со скоростью около 20 MIPS. Улучшенная производительность будет достигнута за счет увеличения максимальной тактовой частоты до 200 МГц (с 80 МГц) и архитектуры, которая конвейеризирует инструкции, выполняя в среднем почти одну инструкцию за такт (примерно десятикратное увеличение). [7]
Propeller 1 (P8X32A) теперь является 100% открытым многоядерным микроконтроллером, включая все аппаратное обеспечение и инструменты... Propeller 1, возможно, является самым открытым чипом в своем классе.