ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
652792
Evgeny_CD, Архитектор (12.02.2016 23:37 - 23:40, просмотров: 8399)
PIC32MZ новые, с M-Class Core + microkernel - созданы друг для друга? Камень на дижикее PIC32MZ2048EFH144-I/PH - 100 шт - $10.48 * FLASH - 2M + 160kB boot * RAM - 512k * 16к кеш кода и 4к кеш данных * 8 банков регистров общего назначения! * CAN, RNG, no Crypto - специально для нас * MMU! * up to 330 DMIPS... даже если надурили, и в реальности их 200-250 DMIPS, все равно чертовски быстро! DV244005 MPLAB REAL ICE - $499.98 там же. Тоскливо, но один раз пережить можно. Чтение доки на камень просто выдавливает в осадок. "Все, о чем мы мечтали, но боялись попросить". DSP 4 64 битных аккумулятора, аппаратная плавучка до дабловой включительно, 8 банков регистров общего назначения... И цена, цена... Errata какая-то удивительно пушистая. Неужто это монстровое ядро уже оттестировали как следует? Как-то стремно, если честно. MPLAB® Harmony Integrated Software Framework http://www.microch …mplabharmony/home.html Вроде бы совсем недавно мы что-то похожее слышали...Renesas Synergy... http://caxapa.ru/649610.html Теперь возникает вопрос, чем рулить этим монстром. Какая RTOS? Можно взять стандартное - RTEMS, eCOS, NuttX http://caxapa.ru/650955.html Вагон и маленькая тележка коммерческих ОСей. Но! У камня есть 3 очень важных фичи: * полноценный MMU * 8 банков регистров * Множественный DMA Которые, если их использовать, сильно добавят кайфа в embedded приложениях. Но для этого ОСька доджа их поддерживать, чего все приведенные выше ОСьки не умеют. Справедливости ради надо сказать, что NuttX: May be built either as an open, flat embedded RTOS or as a separtely built, secure micro-kernel with a system call interface И поддержку банков регистров можно прикрутить, наверное, Т.е. при использовании стандартных ОСей получается тупая конкуренция с Cortex-M7, Renesas RX 2 поколения. Причем шанса выиграть у микрочипа нет - толпа юзеров Cortex-M7 все равно больше (свежекупленный Atmel поможет Microchip в этом), а Renesas все равно сильнее как фирма. Теперь обратимся к идее микроядерности http://caxapa.ru/652378.html http://caxapa.ru/652392.html За счет MMU, относительно большого объема ОЗУ и относительно быстрого процессора, можно создать базовую "микроядерную" среду, которая, скажем, будет эквивалентна в среднем 200 DMIPS ядру и 400к ОЗУ. Причем 7 процессов (процессы ОСи, прерывания) могут быть высокоприоритетными, которые можно вызывать хоть с частотой 1 МГц - нет затрат на сохранение и восстановление стека! И в этой среде нельзя "шарахнуть" по памяти, зато можно, например, творить чудеса следующего рода. Пусть есть высокоуровневый очень сложный код. Он не очень RT. Сам код живет во FLASH, данные в ОЗУ, и инициализируется он быстро. Отлаживать такой код можно долго и нудно, и отлаживать его придется на данных, которые только в поле можно добыть. Пусть этот код упал - шарахнул по памяти, поделился на нуль и проч. MMU все это отсекла, и запустилась соответствующая часть микроядерной ОСи. Код висит, а его входные данные копятся в буфере в ОЗУ. Код устроен так, что он получает на вход блок данных, обрабатывает его, и что-то выдает в ответ. Микроядерка запускает новый инстанс этого кода с новой рабочей областью данных (слава MMU!). Передает коду накопленные данные, и он работает как надо (пока не упадет снова). Замороженный "снапшот" данных кода ставится в очередь на закачку на NAND флешину, и потом, после возвращения из полей, скармливается разработчику. Можно ловить очень редкие и чудесатые баги! Если программа состоит из одних багов, то ничего никуда не закачается до начала нового бага, и "запасная" память резко кончится, но такой хлам в поле не отправляют. Вообще MMU позволит использовать эти 512к ОЗУ очень и очень экономно. Существенным недостатком камня является малоногость и отсутствие SDRAM контроллера. Могли бы и TQFP 176 по примеру Renesas залудить (хотя Reneas серийно даже TQFP 256 выпускает!). Зато есть много достаточно быстрого ОЗУ. Внешняя шина 50 Мгц 16 бит, чтение в 3 такта уложить можно, запись в 3 или 4 - пока не понял. 50*2/4 - 25 Мбайт/сек. Стандартная страница 4к в одну сторону - 160 мкс, что совсем не страшно. 64 кбайта "отсосать" и "залить" - 2.5 мсек. Дальше все понятно. Берем IS66WV51216EBLL-55TLI PSRAM (Pseudo) SRAM 8MB (512K x 16) 55NS 2.5-3.6V 44TSOP 100 - $2.41 Берем CPLD iCE40 Ultra ICE5LP4K-SG48ITR50 IC FPGA 3520LUTS 1.2V 48-ball QFN Package, 0.5 mm, 7.0 mm x 7.0 mm -40°C ~ 100°C 50 - $5.05 И получаем 1 Мбайт страничной памяти с очень малым расходом IO пинов - нужно использовать только ЩД, сигналы управления и несколько пинов адресов - остальная логика с оптимальными для PSRAM таймингом в CPLD. Можно взять IS66WVE4M16EBLL-55BLI IC SRAM 64MB 55NS 48BGA 100 - $3.94 и получить 8 Мбайт. Если мы выделяем 256 к ОЗУ под Lua (что для eLua очень и очень много, можно запустить весьма сложный скрипт), скажем, то отсосать залить - 10 мс, причем в это время процессор сможет спокойно заниматься делом. Если мы запускаем Lua каждые 50 мс, скажем, то вполне нормально. MMU при наличии хорошего шедулера позволит творить чудеса. Пусть у нас есть быстрые статические задачи и некоторое количество динамических задач. Для статических стек и данные всегда живут в ОЗУ по фиксированным адресам. А динамические запускаем так. Пусть они запускаются с тиком 10 мс. Пока задача работает, в фоне, в другом куске ОЗУ идет загрузка области данных другой задачи. При переключении настроим MMU - и новая задача как ни в чем не бывало работает в своем адресном пространства. Данные от старой задачи в это время сбрасываются во внешнюю память. Еще пример из жизни. UFFS http://caxapa.ru/650201.html На больших современных NAND она будет потреблять десятки килобайт ОЗУ. Которых даже в 512к может не найтись. С другой стороны, часто операции можно прогнозировать вперед. Если я пишу лог - то я могу запросить у допиленной UFFS зарезервировать для меня десяток-другой секторов. Т.е. я "засвапливаю" в память 64к (как пример) данные потока UFFS, он выдает мне список зарезервированных секторов, я его храню в отдельной области межпроцессного взаимодействия, потом я вытесняю UFFS от слова совсем, логгерный поток пишет по подготовленной таблице в сектора, он может даже прочитать для надежности и пометить в таблице, что в такой-то сектор плохо записалось, и этот сектор пропущен, а записали в следующий, и потом снова оживляем UFFS - пусть она со всем этим разбирается и готовит мне очередной десяток секторов. Да, а чтобы все эти фокусы хорошо работали, у нас есть 2 ключевых компонента: 8 банков регистров и отдельные, независимые от встроенные в периферию контроллеров DMA, 8 каналов универсального DMA. Процедура обмена с внешней страничной памятью будет быстрой и малонагрузочной для всего остального. MMU также крайне полезен с точки зрения резидентного монитора. А такой монитор очень и очень полезен в реальной жизни. JTAG, особенно USB, очень неудобен при длительных прогонах аппаратуры, и часто сам является источником багов - потом хрен поймешь, от чего устройство повисло. А иметь резидентный монитор, который всегда доступен по сети (например, UDP для простоты) - это супер! Монитор живет в уголке, защищенный MMU, а сам он защищает контроллер прерываний от перепрограммирования. И убить монитор в такой ситуации почти невозможно. В итоге мы имеем массу потенциально много очень интересных фишек PIC32MZ (версия M-Class Core), для реального использования которых нужна в идеале микроядерная ОСька. Кто-то скажет, что я о-ел окончательно, и сложность описанного мною чуда не позволит его отладить в будущем. Верно, при традиционном подходе такое никогда не взлетит. Но у меня все же в голове потихоньку, от года к году, проясняется идеология разработки и отладки очень сложных систем. Вот там это точно взлетит. Основы: * программист пишет код на некотором специальном языке, и код хранится в виде единой БД, нет никакого разбиения на файлы. * прописана системы иерархий, в которой в равной степени перемешаны реальные и виртуальные сущности. Это что-то типа классов, но гораздо мощнее. * код на этом надС верифицируется в полуавтоматическом режиме как с точки зрения функциональных тестов, так и защита от разных ошибок. Полуавтоматически - анализ кода готовит программа, а решения принимает человек. * С код генерится перед компиляцией, одновременно с автоматической генерацией make файлов и файлов линкера. Никаких бинарных библиотек нет в принципе. * встроенная система визуализации чего угодно - чтобы можно было легко и просто гулять по дереву кода, переключаться от графического отображения control flow к коду и прочее * сквозная БД тегов кода с двусторонними ссылками. Т.е. внутри функции тулза для написания кода видит только то, что разрешено использовать функции, в том числе отдельно описанные глобальные переменные. Потом идем в секцию глобальных переменных и смотрим, что их использует, особенно слева от оператора =. Все необходимые для понимания поста документы вложены.