Архитектура контроллеров Propeller
Это – вторая присланная статья, в этом блоге. Огромное спасибо Raymond за его старания! // BSVi //
В этой статье я хотел бы вкратце рассказать о ИМС Propeller, среде разработки и, конечно же, о личных впечатлениях от сего чуда техники. Как же без этого. 🙂 Начну с краткого описания архитектуры, а во второй статье попробуем чего-нибудь написать.
Следует отметить, что на бурно развивающемся рынке микроконтроллеров чип Propeller от компании Parallax качественно отличается от остальных. Первым, что бросается в глаза – это восьмиядерность P8X32A. Само название говорит о том, что нашем наличии – восемь 32-разрядных независимых абсолютно одинаковых вычислительных модулей (фон-неймановской архитектуры), или cog’ов (cog – зубец шестеренки). Это представлено на следующей блок-схеме (кликабельно):
Все cog синхронны, то есть, тактируются от одной системной шины, но могут исполнять независимые задачи. Каждый cog содержит свое ОЗУ на 512 двойных слов, 16 регистров и свою периферию – коммутаторы портов и два таймера, каждый со своим PLL (с частотой до 128 мегагерц), возможностью ШИМ и генерации видеосигнала. Каждое ядро может быть многократно остановлено и запущено, а действия – скоординированы через общее ОЗУ.
Кроме индивидуальной памяти каждого процессорного модуля существует общая память 64 КБ, разделенная на ОЗУ и ПЗУ по 32 КБ каждое. В ПЗУ находится программируемые на заводе константы — таблицы четверти волны синуса, логарифма и экспоненты, что может быть полезно для проведения быстрых операций умножения, деления, возведения в степень, извлечение корней. Тут же находятся таблицы знакогенератора и шрифта Parallax (256 символов по 16*32 пикселей каждый) и, что самое главное, бутлоадер и интерпретатор языка Spin. В ОЗУ находится сама программа, которая может быть загружена с хоста, или с внешней энергонезависимой памяти EEPROM.
Все восемь cog соединены между собой четырьмя 32-разрядными шинами – традиционными шинами адреса и данных, а также двумя шинами разделяемых ресурсов – шиной доступа к 32-м портам ввода-вывода и шиной доступа к общесистемному счетчику машинных циклов. При этом каждое ядро может в любой момент асинхронно прочесть как значение счетчика, так и состояние выводов. Кроме общих ресурсов существуют и взаимоисключающие, среди которых оперативная память размером 32 килобайта, а также аппаратные флаги (locks) которые позволяют избежать одновременного доступа к взаимоисключающим ресурсам.
Все восемь cog коммутируются общим hub’ом, осуществляющим доступ вычислительных модулей к взаимоисключающим ресурсам, тем самым обеспечивая целостность системы (изображен в правой нижней части рисунка). Хаб переключается на одно положение каждые два цикла, поскольку таких позиций восемь (по количеству cog’ов), то полный поворот хаба (а значит и доступ конкретного ядра к взаимоисключающим ресурсам) осуществляется каждые 16 циклов. Именно благодаря round-robin структуре концентратора, P8X32A назван Propeller’ом.
Микроконтроллер содержит внутренний RC-осциллятор на 12 Мгц и 20 КГц, поэтому может быть запущен без внешнего кварцевого резонатора. При использовании системного PLL необходимо использовать кварцевый резонатор, частота которого может быть умножена на 2, 4, 8 или 16 раз. Максимальная рабочая частота ядер согласно документации составляет 80 Мгц. Если учесть, что каждое ядро четырехтактное (к сожалению), оно может производить до 20 МІPS, а если вспомнить, что их восемь, общая производительность может достигать 160 MIPS, что очень неплохо для микроконтроллера такого класса.
Интересно то, что Propeller вообще не использует прерывания. В первый момент это кажется странным. Но система имеет восемь ядер, на каждое из которых может быть возложена своя задача, например, опрос клавиатуры, результат же может быть доступен другим ядрам в виде взаимоисключающего ресурса. Кроме того, существуют такие ассемблерные инструкции, как ожидание по изменению состояния пина, или таймера.
Микроконтроллер оснащен 32 линиями ввода/вывода. Линии P28..P31 имеют также специальные функции во время начальной загрузки и могут быть использованы внутренним приложением после нее. Поскольку выводы контроллера являются общим ресурсом, поэтому надо иметь в виду, что несколько разных cog в принципе могут контролировать одну и ту же линию. Ее состояние определяется согласно трем основным правилам:
- Вывод является входом только если ни один из активных сog не устанавливает его как выход.
- На выводе будет низкий уровень только в том случае, когда все активные сog, которые установили его как выход, установят его в ноль.
- На выводе будет высокий уровень, если любой из активных сog, установивших его выходом, установит его в единицу.
То есть, реализовано логическое ИЛИ между регистрами значений и регистрами направлений каждого сog соответственно, что продемонстрировано на рисунке выше.
Теперь перейдем к конкретным схематическим решениям, которые могут позволить нам опробовать этот чип. Самое простое, что нас необходимо изображено на следующем рисунке.
Как видно, для того, чтобы начать работу с Propeller почти ничего кроме самой микросхемы не нужно, программатор максимально упрощен. Для осуществления связи с хостом необходимо подсоединить выводы P31 к TXD, а Р30 к RXD хоста. Уровни должны быть TTL, это просто достичь используя всевозможные конвертеры уровней TTL-RS232 или что еще лучше и проще – USB-RS232. Замечу, что довольно просто реализовать программный UART по этим же линиям и использовать их как для программирования, так и для приема-передачи данных хосту уже программой микроконтроллера.
Фирменный переходник PropPlug представляет не что иное, как обычная микросхема моста FR232R, дифференцирующая цепочка, подсоединенная к выходу DTR (по умолчанию, но можно изменить в среде разработки) и npn-транзистор (например 2N3904), формирующий сигнал ресета:
Собственно, этого уже достаточно для того, чтобы опробовать Propeller. Программа может быть загружена напрямую в ОЗУ микроконтроллера, что происходит за считанные мгновения и очень удобно в отладке. Если же необходимо хранить программу в конечном приборе, опционально может быть подсоединена EEPROM типа 24LC256 по интерфейсу I2C к выводам P28, P29 как показано на схеме. Сюда я бы еще добавил второй резистор подтяжки на линию SCL и на ресет контроллера для надежности. В своей отладочной плате я решил транзистор, формирующий ресет, внести на саму плату, оставив выход DSR, вам тоже так советую, позволяет использовать любой переходник UART, который у настоящего эмбеддера всегда должен быть в наличии. :) // во истину, аминь, bsvi //
Хотелось бы сказать пару слов о кварце. По умолчанию, если в приложении не будет явно указан источник тактового сигнала (об этом детальнее ниже), будет использован генератор с частотой около 12 МГц. Но если мы хотим использовать PLL и выжать с контроллера все, что можно, необходим кварцевый резонатор. Следует заметить, внешние конденсаторы не нужны вообще, ибо они присутствуют внутри и могут быть подключены или отключены. Чтобы достичь максимальной частоты 80 МГц нужен кварц 5 МГц и множитель 16. Поскольку кварц на такую частоту не лежит где попало, я использовал на 6 МГц чем получил частоту 96МГц. Оверклокинг 16 мегагерц как нечего делать – работает очень стабильно. Но при резонаторе 8 МГц и множителе 16 контроллер запускаться отказался. Всему есть предел. 🙂
На этом завершу общий обзор ИМС Propeller. В следующей статье – примеры программирования.
Raymond
Вообще, встроить операционку в контроллер — очень хорошая идея, все равно, старшие контроллеры только с ОС и используются. Но вот подход мне не очень нравится — слишком уж оригинально, и, потому, не прижилось.
Лучше бы сделали одно стандартное ядро с аппаратным планировщиком/семафорами.
А там есть ОС ? Raymond написал, что помимо таблиц и шрифтов в ROM зашит интерпретатор Spin.. Что такое Spin ? Некий уникальный высокоуровневый язык или ассемблер ? Если ассемблер, то почему интерпретатор ? И можно ли программировать данный кристалл на чем-нибудь другом ?
Насколько я понимаю, Куча ядер является эквивалентом ОС. Про Spin Рэй сам лучше расскажет.
aeore, ответы на ваши вопросы по программированию ИМС Propeller вы найдете в статье, которая будет выложена очень скоро. 🙂
А мне понравилась идея.
Хорошая, понятная статья.
ЗЫ Надо пересиливать лень и в быстром темпе нагонять МК своей кривой тропинкой =)