Приехал BeMicro MAX 10 FPGA Evaluation Kit от Arrow. Забавная весьма железяка, однако индастриал ждать аж до июля следующего года. Тоска-печаль. Отложил до лучших времён.
UFM действительно имеет частоту клока 116МГц, но это никак не указывает на скорость работы флэша — это клок контроллера. По диаграммам работы команды Read видно, что после строба чтения контроллер висит неопределенное время в ожидании строба готовности. Я перерыл даташиты, но соответствующей времянки не нашел. Из опыта чтения даташита на MAX II знаю, что это время позорно огромное и ни о какой выборке микрокода и речи быть не может (у макс2 это 10МГц что ли). Вангую, что и здесь это в лучшем случае мегагерц 30, хорошо если не 20.
Время загрузки действительно впечатляет, но это и неудивительно: ширина флэша 32 бита.
Насчет поддержки старых чипов. У альтеры скорее есть традиция обламывать поддержку в версии х.1 — поддержка асекса оборвана в 9.1 (в 9.0 она еще есть, ее и пользую для этих чипов), в 13.1 уже забыли про цыцлон 2 (в 13.0.1 еще есть), а в 14 версии (единственной, где поддержан макс 10) уже нету даже ц3.
Как я и написал, что магазин дорогой, но есть интересные штучки.
Как вариант уменьшения стоимости доставки использовать компанию посредника, вот пример стоимости доставки из магазина посреднику, но это исключительно как пример, если вдруг там найдется то, чего нельзя найти где-то еще и стоимость услуг посредника будет оправдана. А для наших соотечественников в штатах может даже и не столь дорого получится :)
Просто интересно, из Украины кто-то покупает там?
Ради интереса бросил невесомую мелочевку в корзину и посмотрел сколько стоит доставка. Вот варианты: screencast.com/t/0QMLZkLCz
Это даже не смешно :)
хорош он тем, что за счет смещения считывателей каналов на четверть сектора, гарантированно не будет случая, когда светодиод считываемого канала будет наполовину закрыт шторкой, и не понятно, это еще единица, или уже нуль.
т.е. код Баркера в таких граничных случаях позволяет однозначно считать данные.
Не встречал. Да и что embedded что не embedded — я лишь перечислил малую долю инструментов С++, которые улучшают качество кода. Об этом можно почитать у Макконекела «Совершенный код» — толстенный и полезный талмуд. Конкретно по С++ рекомендую прочесть статьи блога PVS Stduio на хабре и на сайте — там что ни статья — разбирается огромное число примеров простых но серьезных ошибок.
Для Embedded, ИМХО, достаточно не использовать дорогие операции. STL немножко можно, но аккуратно.
Если ARM и в запасе ОЗУ больше 64к — ни в чем себе не отказывайте :)
Сейчас пилю проект на 16МГц ARM Cortex-M3 и 8кбайт ОЗУ (из которых 6 съедают буферы для UART) — вот где боль :)
Для матерых С-шников вроде меня рекомендую книгу Ira Pohl C++ for C programmers. Все перечисленное выше — там подробно разбирается. Но конкретно перечисленное выше — то что реально облегчает мой эмбед-кодинг.
До сих пор эту книгу никак не закажу, но я проходил курс на Coursera в начале года.
А так, наиболее полный источник — это практика :) Практика разгребания чужого кода конечно же :)
Не стоит путать красное с пресным:
C++ это не только абстракция и наследование, но еще и как минимум(краткий список полезных для эмбеддера фич):
0. Пространства имен! Нет, правда, создавая большой проект на С я затрахиваюсь перед каждой функцией добавлять префикс. В С++ это решается с помощью namespace и классов. И когда ты ставишь точку, автодополнение дает тебе список ТОЛЬКО того, что тебе можно.
1. Разделение уровней доступа — если у меня и есть какая-то внутренняя переменная, то в С иногда сложно избежать соблазна не поставить костыль. В C++ внутри класса я просто делаю ее private. Отсюда — приходится продумывать архитектуру приложения — на поддержке кода это очень пригодится.
2. Перегрузка функций и шаблоны. Правда, просто обожаю в С продумывать функции для всех возможных типов данных. И для uint8_t и для int8_t и 16_t и 32_t и float и т.д. и т.п.
3. Безопасное кастование! Сравните static_cast и reinterpret_cast(аналог С-шных скобочек (type_t)var). Мне иногда попадаются просто фееричные преобразования типов в разгребаемом коде, когда они неявно перегоняются из знакового в беззнаковый, из short в long да по нескольку раз… static_cast в отличие от reinterpret_cast в неподобающих случаях вызовет ошибку компиляции и заставит хорошенько подумать. Причем в С ошибка может быть обнаружена только с помощью статического анализа кода(PVS Studio справляется, Clang и cppcheck — как правило нет). Ну может быть он ругнется на сравнение знаковой и беззнаковой переменной в if или в переходе от double к float… или вы скормили const в не cosnt…
4.Перечисляемые типы. Дефайны — зло. Есть тысяча и один кейсов, когда они могут привести к некоторым проблемам, ОСОБЕННО!!! при отсутствии пространства имен. Вы уверены, что своим дефайном вы ничего не переопределили? Или, например, не включили какую-нибудь опцию вида #if defined(FOO)? В том или ином виде enum есть со времен ANSI C, Classname.enum таки гораздо функциональнее.
Список можно продолжать до бесконечности. Самое главное — все что я описал не требует мегабайтов памяти ни в коде ни в оперативке, реализуется абсолютно всеми компиляторами C++ (в отличие от специфичных функций современных стандартов) и реально экономит время и силы.
Так я же не спорю с тем, что это не возможно в принципе. Но развернуться все равно не удастся. Тогда зачем расширять языковые рамки, если потом все время придется себя сдерживать. А еще хуже, что когда вы построите всю абстракцию C++ и дойдете до конкретной реализации, то можете вылететь за пределы ОЗУ и в этот момент поймете, что этот подход вам в принципе не годится (так и было у меня). Поэтому я ставлю себе заранее рамки: для AVR-8 только С и никакого С++.
У них есть что-то что нельзя купить в другом месте?
ЗЫ: У нас тут на рубль 33% скидка к черной пятнице), поэтому скидка в 10% — вообще несерьезно :)
Время загрузки действительно впечатляет, но это и неудивительно: ширина флэша 32 бита.
Насчет поддержки старых чипов. У альтеры скорее есть традиция обламывать поддержку в версии х.1 — поддержка асекса оборвана в 9.1 (в 9.0 она еще есть, ее и пользую для этих чипов), в 13.1 уже забыли про цыцлон 2 (в 13.0.1 еще есть), а в 14 версии (единственной, где поддержан макс 10) уже нету даже ц3.
Как вариант уменьшения стоимости доставки использовать компанию посредника, вот пример стоимости доставки из магазина посреднику, но это исключительно как пример, если вдруг там найдется то, чего нельзя найти где-то еще и стоимость услуг посредника будет оправдана. А для наших соотечественников в штатах может даже и не столь дорого получится :)
Ради интереса бросил невесомую мелочевку в корзину и посмотрел сколько стоит доставка. Вот варианты:
screencast.com/t/0QMLZkLCz
Это даже не смешно :)
Ждем открытой беты)
У меня кажысь 9 стоит :(
т.е. код Баркера в таких граничных случаях позволяет однозначно считать данные.
Я тоже записывался.
Для Embedded, ИМХО, достаточно не использовать дорогие операции. STL немножко можно, но аккуратно.
Если ARM и в запасе ОЗУ больше 64к — ни в чем себе не отказывайте :)
Сейчас пилю проект на 16МГц ARM Cortex-M3 и 8кбайт ОЗУ (из которых 6 съедают буферы для UART) — вот где боль :)
Для матерых С-шников вроде меня рекомендую книгу Ira Pohl C++ for C programmers. Все перечисленное выше — там подробно разбирается. Но конкретно перечисленное выше — то что реально облегчает мой эмбед-кодинг.
До сих пор эту книгу никак не закажу, но я проходил курс на Coursera в начале года.
А так, наиболее полный источник — это практика :) Практика разгребания чужого кода конечно же :)
C++ это не только абстракция и наследование, но еще и как минимум(краткий список полезных для эмбеддера фич):
0. Пространства имен! Нет, правда, создавая большой проект на С я затрахиваюсь перед каждой функцией добавлять префикс. В С++ это решается с помощью namespace и классов. И когда ты ставишь точку, автодополнение дает тебе список ТОЛЬКО того, что тебе можно.
1. Разделение уровней доступа — если у меня и есть какая-то внутренняя переменная, то в С иногда сложно избежать соблазна не поставить костыль. В C++ внутри класса я просто делаю ее private. Отсюда — приходится продумывать архитектуру приложения — на поддержке кода это очень пригодится.
2. Перегрузка функций и шаблоны. Правда, просто обожаю в С продумывать функции для всех возможных типов данных. И для uint8_t и для int8_t и 16_t и 32_t и float и т.д. и т.п.
3. Безопасное кастование! Сравните static_cast и reinterpret_cast(аналог С-шных скобочек (type_t)var). Мне иногда попадаются просто фееричные преобразования типов в разгребаемом коде, когда они неявно перегоняются из знакового в беззнаковый, из short в long да по нескольку раз… static_cast в отличие от reinterpret_cast в неподобающих случаях вызовет ошибку компиляции и заставит хорошенько подумать. Причем в С ошибка может быть обнаружена только с помощью статического анализа кода(PVS Studio справляется, Clang и cppcheck — как правило нет). Ну может быть он ругнется на сравнение знаковой и беззнаковой переменной в if или в переходе от double к float… или вы скормили const в не cosnt…
4.Перечисляемые типы. Дефайны — зло. Есть тысяча и один кейсов, когда они могут привести к некоторым проблемам, ОСОБЕННО!!! при отсутствии пространства имен. Вы уверены, что своим дефайном вы ничего не переопределили? Или, например, не включили какую-нибудь опцию вида #if defined(FOO)? В том или ином виде enum есть со времен ANSI C, Classname.enum таки гораздо функциональнее.
Список можно продолжать до бесконечности. Самое главное — все что я описал не требует мегабайтов памяти ни в коде ни в оперативке, реализуется абсолютно всеми компиляторами C++ (в отличие от специфичных функций современных стандартов) и реально экономит время и силы.
Стек и память вообще очень просто контролируются.