ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
420583
Evgeny_CD, Архитектор (27.06.2013 23:58, просмотров: 20389)
Так так, кажись fk0 ни разу не ошибся, сказав, что смерть текущему мироустройству в мире MCU прийдет из мира WEB. Кажись, я вкурил, отчего все так резко ломанулись делать embedded на разновидностях JS. Спасибо amusin --> За наводку.  http://caxapa.ru/420543.html
http://caxapa.ru/420315.html
Возьмем типовой современный топовый контроллер : 1M FLASH 128K SRAM. Казалось бы память дофига. Кода так точно. Но MCU = RT. Значит, вытесняющая RTOS. И эти 128к очень быстро кончатся. Да еще и куча проблем при ювелирном нарезании стека под задачи - если "байты" экономить. Ну ладно, MPU точно определит место, где у нас стек кончился - но толку ту? MMU есть только в PowerPC FLASH контроллерах, и хотя они весьма недороги, http://caxapa.ru/419165.html , это все же экзотика. А без MMU MPU полезен, по большому счету, только для отладки в поле. Однако, мы не одиноки в этом мире проблем. Стоит MCU заменить на web server, а RT задачи на запросы 100500 юзеров, как встанет та же проблема. Ну ладно, памяти на современных серваках дохрена, и кончится она не скоро, а вот ресурсы проца с переключением между 100500 тредами, кончатся гораздо быстрее памяти. jsconf.pdf на стр 9 и 10 хорошо показана разница в ресурсоемкости Apache и NGINX. Апач - 1 поток на один коннект. NGINX - 1 поток. scalable-networking.pdf - хорошо показано на примере масштабирования WEB серверов. JS зело стандартен в мире WEB программизма, ибо открытый межднародный стандарт. И, как утверждается, в силу этого типа очень переносим. Тут народ родил идею node.js: http://ru.wikipedia.org/wiki/Nodejs http://habrahabr.ru/post/182628/ http://nodejs.org/about/ * событийное управление * event loop * любые конструкции языка не блокируют управление Идею понесли на бигльбоард http://beagleboard …org/Support/BoneScript BoneScript is a node.js-based language specifically optimized for the Beagle family and featuring familiar Arduino function calls, exported to the browser JavaScript Timing Events http://www.w3schoo …s.com/js/js_timing.asp А вот пример проектика - робот https://sites.goog …e/beaglebonerobot/home "SnrDes_Final Presentation.pptx" - преза по проекту "FINAL-Report_Senior Design.docx" - описание, включая js код, вставленный в Word (бр....) Поробую еще раз описать идею своими словами. Пусть будет простая RTOS, которая управляет простыми RT процессами, суть обработчики прерываний и простые драйвера. Такое может написать каждый (С) Есть FLASH, пусть он будет большой и однотактовый (мечты :) ) И совсем скоро в main stream будет 256к ОЗУ. Процессор ОДНОВРЕМЕННО не будет работать с 256 к ОЗУ. Можно наплодить 100500 потоков, который будут курить бамбук в ожидании своих евентов или тайм слота шедулера, а можно поступить умнее. Разбиваем код на небольшие кусочки. И некая VM после каждого кусочка планирует - а что делать дальше. И идет туда, и делает этот кусочек, и все это без вытеснения контекста. У нас будут потери времени на это планирование, и это вроде как будет сильно медленее, чем plain C. Однако, если для кода нет ОЗУ - вопрос о скорости не актуален. А с учетом обмена с более медленной внешней памятью, особенно в варианте MCU, проигрыш по скорости будет далеко не так фатален. В варианте MCU у нас нет двухканального 64 бита каждый канал контроллера DRAM, мегабайтов кеша и проч. У нас есть, как правило, 16 бит DRAM шина и отсутствие кеша как класс. Что у нас есть на кристалле в топовых MCU? Правильно, там есть второй процессор :) LPC43xx, PowerPC за $12 http://caxapa.ru/419165.html - можно разлочить ядра и пустить их независимо. И тогда нам нужна всего одна мелочь - быстрый однотактовый механизм обмена сообщениями между ядрами - чтобы получилась песня: * одно ядро молотит VM * второе ядро суть RTOS с простыми задачами и тот самый "планировщик что делать дальше" + сборщик мусора - менеджер объектов :) VM ничего не зает про адреса в памяти, она, например, получает в стек ссылки на адреса объектов, который суть линейный кусок в памяти. А служебное ядро перед вызовом "куска кода" склеивает объект из кусочков в один кусок памяти. Счетчик ссылок и т.д. Кто-то скажет: "Классная идея! Давайте такую штуку на C++ сделаем!" Тут есть своим тонкости. Чтобы программирование VM доставляло удовольствие, в синтаксисе языка должна быть поддержана вся эта событийная ориентированность и проч. И С++, несмотря на весь свой "синтаксический сахар", все равно по удобству проиграет "заточенному" DSL (http://ru.wikipedi …0%B0%D0%BD%D0%B8%D1%8F) VM, несмотря на свои процессорные оверхеды, очень удобны тем, что позволяют простым способом (по сравнению с "расширением" GCC) сделать собственный язык программирования. Или диалект какого-то языка. Чем создатели node.js и asm.js (http://caxapa.ru/420383.html) воспользовались. Строго говоря, для embedded мира надо еще сделать еще некий "планировщик задач по памяти". Чтобы вызывать те куски кода|наборы кусков кода, для который скопилось больше всего данных в памяти, и которые имеют шанс сожрать эти данные и осовободить память :) Что касается конкретного языка - тут я в отношении JS и node.js настроен несколько пессимистично. http://comments.gm …avascript.nodejs/30200 как тут написано, REPL http://nodejs.org/api/repl.html занимает REPL is ~7.5MiB resident and ~45MiB virtual. With a light load of 5 http clients making back-to-back requests it uses 12MiB resident, 50MiB virtual. Для embedded крайне привлекательно было бы сделать DSL, который можно было бы компилить в некое подмножество C, который, в свою очередь, переводился бы в бинарник стандартным способом. В процессе этого преобразования можно было бы автоматически генерить код, который занимается всем этим "менеджментом виртуальной машины". Пусть в нашем "супер языке" будут сишные типы данных, массивы и "кросс-сегментные структуры". Последнее - это когда в одну структуру объединены переменные (ОЗУ) и константы (FLASH), синтаксис - как у обычной структуры. Каждый объект - это связанный список областей памяти. И под всю эту "работу с памятью" С код пусть генерится автоматически. В принципе, можно рассмотреть вариант автоматической генерации кода под кооперативную ОСь. Т.е. "супер-язык" не сильно отличается от С, но в нужном месте автоматически включаются нужные проверки и вызовы, чтобы не выносить моск программисту. Резюме: * с учетом одновременного роста скорости ядра и объема набортного FLASH при скромном росте набортной RAM идея VM, особенно если камень двухядерный, имеет смысл * в очередной раз убеждаемся, что если С|С++ - большой рынок в развитии микроконтроллерного дела, но тупое копирование подходов, которые применяются при С|C++ программизме в мире больших машин, далеко не всегла приносит пользу. Особенно это касается массового увлечения многопоточностью. * язык и виртуальную машину (или транслятор) для FLASH MCU придется разрабатывать с нуля. Слишком все другое в мире "больших машин" * наконец-то есть идея, как извлечь пользу из многоядерных контроллеров :)