Архитектура контроллеров Propeller

Опубликовано в рубрике "Статьи", 14.04.2010.

Это – вторая присланная статья,  в этом блоге. Огромное спасибо Raymond за его старания!     // BSVi //

В этой статье я хотел бы вкратце рассказать о ИМС Propeller, среде разработки и, конечно же, о личных впечатлениях от сего чуда техники. Как же без этого. 🙂 Начну с краткого описания архитектуры, а во второй статье попробуем чего-нибудь написать.

 

PropLogo

    Следует отметить, что на бурно развивающемся рынке микроконтроллеров чип Propeller от компании Parallax качественно отличается от остальных. Первым, что бросается в глаза – это восьмиядерность P8X32A. Само название говорит о том, что нашем наличии – восемь 32-разрядных независимых абсолютно одинаковых вычислительных модулей (фон-неймановской архитектуры), или cog’ов (cog – зубец шестеренки). Это представлено на следующей блок-схеме (кликабельно):

 

PropellerArch

 

    Все 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 в принципе могут контролировать одну и ту же линию. Ее состояние определяется согласно трем основным правилам:

  1. Вывод является входом только если ни один из активных сog не устанавливает его как выход.
  2. На выводе будет низкий уровень только в том случае, когда все активные сog, которые установили его как выход, установят его в ноль.
  3. На выводе будет высокий уровень, если любой из активных сog, установивших его выходом, установит его в единицу.

    То есть, реализовано логическое ИЛИ между регистрами значений и регистрами направлений каждого сog соответственно, что продемонстрировано на рисунке выше.

 

 

    Теперь перейдем к конкретным схематическим решениям, которые могут позволить нам опробовать этот чип. Самое простое, что нас необходимо изображено на следующем рисунке.

PropellerConnection

    Как видно, для того, чтобы начать работу с Propeller почти ничего кроме самой микросхемы не нужно, программатор максимально упрощен. Для осуществления связи с хостом необходимо подсоединить выводы P31 к TXD, а Р30 к RXD хоста. Уровни должны быть TTL, это просто достичь используя всевозможные конвертеры уровней TTL-RS232 или что еще лучше и проще – USB-RS232. Замечу, что довольно просто реализовать программный UART по этим же линиям и использовать их как для программирования, так и для приема-передачи данных хосту уже программой микроконтроллера.

    Фирменный переходник PropPlug представляет не что иное, как обычная микросхема моста FR232R, дифференцирующая цепочка, подсоединенная к выходу DTR (по умолчанию, но можно изменить в среде разработки) и npn-транзистор (например 2N3904), формирующий сигнал ресета:

 PropellerPlug

 

    Собственно, этого уже достаточно для того, чтобы опробовать Propeller. Программа может быть загружена напрямую в ОЗУ микроконтроллера, что происходит за считанные мгновения и очень удобно в отладке. Если же необходимо хранить программу в конечном приборе, опционально может быть подсоединена EEPROM типа 24LC256 по интерфейсу I2C к выводам P28, P29 как показано на схеме. Сюда я бы еще добавил второй резистор подтяжки на линию SCL и на ресет контроллера для надежности. В своей отладочной плате я решил транзистор, формирующий ресет, внести на саму плату, оставив выход DSR, вам тоже так советую, позволяет использовать любой переходник UART, который у настоящего эмбеддера всегда должен быть в наличии. :)  // во истину, аминь, bsvi //

    Хотелось бы сказать пару слов о кварце. По умолчанию, если в приложении не будет явно указан источник тактового сигнала (об этом детальнее ниже), будет использован генератор с частотой около 12 МГц. Но если мы хотим использовать PLL и выжать с контроллера все, что можно, необходим кварцевый резонатор. Следует заметить, внешние конденсаторы не нужны вообще, ибо они присутствуют внутри и могут быть подключены или отключены. Чтобы достичь максимальной частоты 80 МГц нужен кварц 5 МГц и множитель 16. Поскольку кварц на такую частоту не лежит где попало, я использовал на 6 МГц чем получил частоту 96МГц. Оверклокинг 16 мегагерц как нечего делать – работает очень стабильно. Но при резонаторе 8 МГц и множителе 16 контроллер запускаться отказался. Всему есть предел. 🙂

На этом завершу общий обзор ИМС Propeller. В следующей статье – примеры программирования.

Raymond

Комментарии
  1. BSVi написал(а) 14th Апрель, 2010 в 21:13

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

    Лучше бы сделали одно стандартное ядро с аппаратным планировщиком/семафорами.

  2. aeore написал(а) 14th Апрель, 2010 в 22:45

    А там есть ОС ? Raymond написал, что помимо таблиц и шрифтов в ROM зашит интерпретатор Spin.. Что такое Spin ? Некий уникальный высокоуровневый язык или ассемблер ? Если ассемблер, то почему интерпретатор ? И можно ли программировать данный кристалл на чем-нибудь другом ?

  3. BSVi написал(а) 14th Апрель, 2010 в 22:52

    Насколько я понимаю, Куча ядер является эквивалентом ОС. Про Spin Рэй сам лучше расскажет.

  4. Ray написал(а) 15th Апрель, 2010 в 11:22

    aeore, ответы на ваши вопросы по программированию ИМС Propeller вы найдете в статье, которая будет выложена очень скоро. 🙂

  5. qic написал(а) 14th Апрель, 2010 в 22:40

    А мне понравилась идея.
    Хорошая, понятная статья.
    ЗЫ Надо пересиливать лень и в быстром темпе нагонять МК своей кривой тропинкой =)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.