Введение
Многоядерный микроконтроллер Parallax P8X32A Propeller - это многоядерный процессор с параллельной компьютерной архитектурой микроконтроллер с восьми 32-битными уменьшенными командами набора компьютеров (RISC) центрального процессора (CPU). Он был представлен в 2006 году, разработан и продается компанией Parallax, Inc. Микроконтроллер Propeller, язык сборки Propeller и интерпретатор Spin были разработаны соучредителем и президентом Parallax Чипом Грейси. Язык программирования Spin и интегрированная среда разработки Propeller Tool (IDE) были разработаны Чипом Грейси и инженером-программистом Parallax Джеффом Мартином. 6 августа 2014 года компания Parallax Inc. выпустила все оборудование и инструменты Propeller 1 P8X32A в качестве аппаратного и программного обеспечения с открытым исходным кодом под лицензией GNU General Public License (GPL) 3.0. Это включало в себя код Verilog, файлы языка описания аппаратного обеспечения верхнего уровня (HDL), интерпретатор Spin, инструменты и компиляторы программирования PropellerIDE и SimpleIDE.
The Parallax P8X32A Propeller is a multi core processor parallel computer architecture microcontroller chip with eight 32 bit reduced instruction set computer (RISC) central processing unit (CPU) cores. Introduced in 2006, it is designed and sold by Parallax, Inc. The Propeller microcontroller, Propeller assembly language, and Spin interpreter were designed by Parallax's cofounder and president, Chip Gracey. The Spin programming language and Propeller Tool integrated development environment (IDE) were designed by Chip Gracey and Parallax's software engineer Jeff Martin. On August 6, 2014, Parallax Inc. released all of the Propeller 1 P8X32A hardware and tools as open source hardware and software under the GNU General Public License (GPL) 3.0. This included the Verilog code, top level hardware description language (HDL) files, Spin interpreter, PropellerIDE and SimpleIDE programming tools and compilers.
Многоядерная архитектура
Каждое из восьми 32-битных ядра (называемых винтиком) имеет центральный процессор (CPU), который имеет доступ к 512 32-битным словам (2 КБ) инструкций и данных. Самомодифицирующийся код возможен и используется внутри, например, поскольку загрузчик загрузки перезаписывается с помощью интерпретатора Spin. Подпрограммы в Spin (код высокого уровня на основе объектов) используют механизм возврата вызовов, требующий использования стека вызовов. Код сборки (PASM, низкий уровень) не нуждается в стеке вызовов. Доступ к общей памяти (32 КБ памяти случайного доступа (RAM); 32 КБ памяти только для чтения (ROM)) контролируется с помощью круглого списка планирования внутренней контроллером компьютерной шины, называемой концентратором. Каждый винтик также имеет доступ к двум выделенным аппаратным счетчикам и специальному видеогенератору для использования в генерации сигналов синхронизации для PAL, NTSC, VGA, управления сервомеханизмом и других.
Управление скоростью и мощностью
Пропеллер может быть тактирован с использованием внутреннего, на чипе осциллятора (обеспечивая более низкий общий счет частей, но жертвуя некоторой точностью и тепловой стабильностью) или внешнего кристаллического осциллятора или керамического резонатора (обеспечивая более высокую максимальную скорость с большей точностью при более высокой общей стоимости). Только внешний осциллятор может проходить через мультипликатор часов с фиксированной циклонной фазой (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-виночного винта. Потребление энергии может быть уменьшено за счет снижения тактовой частоты до необходимого уровня, отключения ненужных винтиков (которые затем потребляют мало энергии) и переконфигурирования входных и выходной контактов, которые ненужны или могут быть безопасно помещены в состояние высокого импеданса (трастированный), в качестве входов. Когти могут быть переконфигурированы динамически, но опять же, изменение относится ко всем винтикам, поэтому синхронизация важна для определенных конструкций. Некоторая защита доступна для ситуаций, когда одно ядро пытается использовать штифт в качестве выхода, а другое пытается использовать его в качестве входа; это объясняется в техническом справочнике Parallax.
Бортовые периферийные устройства
Каждый винтик имеет доступ к специальному оборудованию для таймера и специальному генератору сигналов таймера, предназначенному для упрощения проектирования этапов вывода видео, таких как композитные дисплеи PAL или NTSC (включая модуляцию для вещания) и мониторы Video Graphics Array (VGA). Таким образом, Parallax предоставляет примерный код, который может генерировать видеосигналы (текст и графику с небольшим разрешением) с использованием минимального количества частей, состоящих из винта, кристаллического осциллятора и нескольких резисторов, чтобы сформировать необработанный цифровой аналоговый преобразователь (DAC). Частота осциллятора важна, так как способность коррекции аппаратного обеспечения видео-тайминга ограничена тактовой частотой. Можно использовать несколько винтовок параллельно для генерации одного видеосигнала. В более общем плане, аппаратное обеспечение может быть использовано для реализации различных сигналов модуляции ширины импульса (PWM).
Встроенный интерпретатор байт-кода Spin
Spin - это многозадачный высокоуровневый компьютерный язык программирования, созданный Чипом Грейси из Parallax, который также разработал микроконтроллер Propeller, на котором он работает, для своей линейки микроконтроллеров Propeller. Код спина написан на Propeller Tool, платформе разработки программного обеспечения, ориентированной на графический интерфейс, написанной для Windows XP. Этот компилятор преобразует код Spin в байт-коды, которые могут быть загружены (с помощью того же инструмента) в основную 32 КБ оперативной памяти и, по желанию, в электрически стираемую программируемую память только для чтения (EEPROM) I2C загрузки чипа Propeller. После загрузки винта интерпретатор байт-кода копируется из встроенной ROM в 2 КБ ОЗУ первичного COG. Затем этот COG начнет интерпретировать байт-коды в основной 32 КБ оперативной памяти. Более одной копии интерпретатора байт-кода может быть запущена в других COG, поэтому несколько потоков кода Spin могут быть запущены одновременно. В программе кода Spin программа сборного кода ((s) может быть вставлена в строку. Эти сборные программы будут работать на своих собственных COG. Как и Python, Spin использует вставку в белое пространство, а не закрученные скобки или ключевые слова, чтобы разграничить блоки. Интерпретатор Propeller для его запатентованного многопоточного компьютерного языка Spin - интерпретатор байт-кода. Этот интерпретатор декодирует строки инструкций, по одной инструкции на байт, из пользовательского кода, который был отредактирован, скомпилирован и загружен в Propeller из специальной интегрированной среды разработки (IDE). Эта IDE, которую Parallax называет инструментом The Propeller, предназначена для использования в операционной системе Microsoft Windows. Язык Spin - это язык программирования высокого уровня. Поскольку он интерпретируется в программном обеспечении, он работает медленнее, чем чистая сборка Propeller, но может быть более эффективной: опкоды сборки Propeller имеют длину 32 бита; директивы Spin имеют длину 8 бит, за которыми может следовать количество 8 бит байтов, чтобы указать, как работает эта директива. Спин также позволяет избежать значительных проблем сегментации памяти, которые должны учитываться для сборного кода. При запуске копия интерпретатора байт-кода (размером менее 2 КБ) будет скопирована в выделенную оперативную память винтики, а затем начнет интерпретировать байт-код в основной 32 КБ оперативной памяти. С этой точки можно запускать дополнительные винтики, загружая отдельную копию интерпретатора в выделенную оперативную память новой винтики (в общей сложности восемь потоков интерпретатора могут работать одновременно). Это означает, что, по крайней мере, минимальное количество кода запуска должно быть кодом Spin для всех приложений Propeller.
Пакет и вводы/выводы
Первоначальная версия чипа (называемая P8X32A) обеспечивает один 32-битный порт в 40-контактном 0.6 в пакете с двойным встроенным подключением (DIP), 44-контактном LQFP или пакете Quad Flat No leads (QFN). Из 40 доступных штифтов 32 используются для ввода/вывода, четыре для питания и заземления, два для внешнего кристалла (если используется), один для обнаружения отключения электроэнергии и браунаута, а один для сброса. Все восемь ядер могут одновременно получить доступ к 32-битному порту (обозначенному "A"; в настоящее время нет "B"). Специальный механизм управления используется для предотвращения конфликтов ввода/вывода, если одно ядро пытается использовать вводно-выводной пин в качестве вывода, а другое пытается использовать его в качестве ввода. Любой из этих штифтов может использоваться для вывода технологий модуляции ширины импульса или времени, описанных выше. Parallax заявил, что ожидает, что более поздние версии Propeller будут предлагать больше ввода-вывода и/или больше памяти.
Виртуальные устройства ввода-вывода
Дизайнеры Propeller разработали его вокруг концепции "виртуальных устройств ввода-вывода". Например, HYDRA Game Development Kit, (компьютерная система, предназначенная для любителей, чтобы научиться разрабатывать видеоигры в ретро-стиле) использует встроенный генератор персонажей и логику поддержки видео для генерации виртуального генератора графического процессора, который выводит VGA цветные картинки, PAL / NTSC совместимые цветные картинки или радиочастотную передачу видео + аудио в программном обеспечении. Запечатленный здесь экран был сделан с помощью программного обеспечения, которое передает данные пикселей через последовательную ссылку на ПК. Библиотеки программного обеспечения доступны для реализации нескольких устройств ввода-вывода, начиная от простых UART и серийных интерфейсов ввода-вывода, таких как SPI, I2C и PS / 2 совместимые серийные интерфейсы мыши и клавиатуры, драйверы для роботизированных систем, MIDI-интерфейсы и ЖК-контроллеры.
Специальные ядра вместо прерываний
Философия проектирования Propeller заключается в том, что жесткая многоядерная архитектура в реальном времени исключает необходимость в выделенном прерывающем оборудовании и поддержке в сборке. В традиционной архитектуре процессора внешние линии прерывания подаются на контроллер прерывания на чипе и обслуживаются одной или несколькими рутинными службами прерывания. Когда происходит прерывание, контроллер прерывания приостанавливает нормальную обработку процессором и сохраняет внутреннее состояние (обычно на стеке), а затем вектора к назначенной процедуре службы прерывания. После обработки прерывания служба выполняет возвращение из инструкции прерывания, которая восстанавливает внутреннее состояние и возобновляет обработку процессором. Для оперативной обработки внешнего сигнала на винте любая из 32 линий ввода/вывода выполнена в качестве ввода. Затем винтику конфигурируют, чтобы она ожидала перехода (либо положительного, либо отрицательного края) на этот вход, используя одну из двух счетных схем, доступных для каждого винта. В ожидании сигнала, винтовка работает в режиме низкой мощности, по сути, спящая. Расширяя эту технику, винт может быть настроен на реакцию на восемь независимых линий прерывания с нулевой задержкой обработки. В качестве альтернативы, одна линия может быть использована для сигнализации перерыва, а затем дополнительные входные линии могут быть прочитаны для определения характера события. Код, работающий в других ядрах, не подвержен влиянию механизма управления прерыванием. В отличие от традиционной многозадачной архитектуры прерывания одного процессора, время отклика сигнала остается предсказуемым, и действительно, использование термина прерывание в этом контексте может вызвать путаницу, поскольку эта функция может быть более правильно рассматривается как опрос с нулевым временем цикла.
Загрузочный механизм
При включении, обнаружении браунаута, сбросе программного обеспечения или сбросе внешнего оборудования, Пропеллер загрузит рутину загрузки машинного кода из внутреннего ROM в оперативную память своего первого (первичного) винта и выполнит его. Этот код имитирует интерфейс I2C в программном обеспечении, временно используя два конца I/O для необходимых последовательных часов и сигналов данных для загрузки пользовательского кода из внешней I2C EEPROM. Одновременно он эмулирует последовательный порт, используя два других ввода-вывода, которые могут быть использованы для загрузки программного обеспечения непосредственно в оперативную память (и, по желанию, во внешнюю EEPROM). Если Propeller не видит команд из последовательного порта, он загружает пользовательскую программу (входный код которой должен быть написан в Spin, как описано выше) из последовательной EEPROM в основную 32 КБ оперативной памяти. После этого он загружает интерпретатор Spin из встроенной в ROM в выделенную оперативную память своего первого винта, перезаписывая большую часть загрузчика. Независимо от того, как загружена пользовательская программа, выполнение начинается с интерпретации исходного пользовательского байт-кода с интерпретатором Spin, работающим в первичной шестерне. После выполнения этого первоначального кода Spin приложение может включить любой неиспользуемый винтик для запуска новой нити и/или запуска процедур сборного языка.
Внешняя постоянная память
Пропеллер запускается из внешней серийной EEPROM; после завершения последовательности загрузки к этому устройству можно получить доступ как к внешнему периферийному устройству.
Другие языковые реализации
Помимо Spin и низкоуровневого сборщика Propeller, на него было портировано несколько других языков.
Компилятор C
Parallax поддерживает Propeller GCC, который является портом компилятора GNU Compiler Collection (GCC) для языков программирования C и C++, для Propeller (branch release 1 0). Компилятор и библиотека C соответствуют требованиям ANSI C. Компилятор C++ соответствует требованиям ANSI C99. Полный C++ поддерживается с внешней памятью. Программа SimpleIDE предоставляет пользователям простой способ написания программ без необходимости создавать файлы. В 2013 году Parallax включил Propeller GCC и Simple Libraries в серию учебных пособий Propeller C Learn. Пропеллер GCC активно поддерживается. Propeller GCC и SimpleIDE официально поддерживаются программными продуктами Parallax. Компилятор ImageCraft ICCV7 для Propeller C был помечен в состоянии окончания срока службы. Существует бесплатный компилятор ANSI C под названием Catalina. Он основан на LCC. Каталина активно поддерживается.
Компилятор BASIC
PropBASIC - это язык программирования BASIC для микроконтроллера Parallax Propeller. 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. Он адаптирован к архитектуре и обязательно отклоняется от любого общего стандарта в отношении архитектурной уникальности, в соответствии с концепцией Форта. Помимо интерпретатора Forth, PropForth предоставляет множество функций, которые используют возможности чипа. Связанные вводы и выводы - это метод ассоциирования потока с процессом, позволяющий одному процессу связываться с следующим на лету, прозрачно для приложения. Это может уменьшить или устранить необходимость в аппаратной отладке или интерфейсе JTAG во многих случаях. Многоканальная синхронная последовательность (MCS) относится к синхронной последовательной связи между пропеллерными чипами. 96-битные пакеты передаются непрерывно между двумя винтами, в результате чего приложения получают дополнительные ресурсы (+6 винтов для каждого добавленного чипа) с небольшим или никаким влиянием на пропускную способность для хорошо сконструированного приложения. LogicAnalyzer относится к пакету расширений, который реализует программный логический анализатор. EEPROMfilesystem и SDfilesystem - это расширения, которые реализуют рудиментарное хранение с использованием EEPROM и SD flash. PagedAssembler относится к пакету оптимизаций, которые позволяют заменять рутинные элементы сборщика (и выключать их путем перезаписи) на лету, что позволяет практически неограниченный размер приложения. Исполнение скрипта позволяет загружать расширения на лету, позволяя исходным кодам программ до размера носителей памяти.
Пропеллер и Java
В настоящее время ведутся работы по запуску виртуальной машины Java (JVM) на Propeller. Разрабатывается компилятор, отладчик и эмулятор.
Компилятор Pascal и время выполнения
Большое подмножество Паскаля реализуется компилятором и интерпретатором, основанным на системе P4 p-кода.
Графическое программирование
PICo программируемый логический контроллер (PLC, PICoPLC) поддерживает выход на пропеллерный процессор. Программа создается в графическом редакторе логики лестницы и полученный код выпускается в качестве исходного кода Spin. PICoPLC также поддерживает P8X32 с функцией создания симулятора запуска. Нет ограничений на целевое оборудование, так как частота осциллятора и IO-пины могут быть свободно настроены в редакторе лестницы. Сайт разработчика PICoPLC .
Будущие версии
С 2014 года Parallax строит новый винтики с винтиками, каждый из которых будет работать примерно с 200 миль в секунду, тогда как винтики текущего винтика будут работать примерно с 20 миль в секунду. Улучшение производительности будет результатом увеличения максимальной тактовой скорости до 200 МГц (с 80 МГц) и архитектуры, которая передает инструкции, выполняя в среднем почти одну инструкцию за тактовый цикл (приблизительно десятикратное увеличение).