Пример теста производительности основанный на подсчете CRC8 на языке J8B
А вот результат работы:
Результат работы теста производительности
Здесь мы видим, что было выполнено тысяча итераций подсчета CRC8 (SMBUS) для последовательности в 64 байта (байтовый массив). Общее время выполнения на ATmega328p на частоте 16МГц - 0.227 секунды, и 0.000227 секунды на одну итерацию.
Этот результат близок к максимально возможной скорости вычисления для ATmega328p на 16МГц для не табличных вычислений и сравним с ассемблерным аналогом. По сути, так и есть - потому что выполняется именно ассемблерный аналог. Однако для прикладного разработчика ничего не изменилось - его код как и ранее высокоуровневый, ему не нужно знать ничего об ассемблере или Си.
И да, ассемблерная функция вычисления CRC8 встроена в RTOS. На первый взгляд, это минус, ведь для каждой новой платформы нужно повторять набор всех ассемблерных функций. Но мой тулкит гибкий - можно реализовать вычисление CRC8 на J8B, а нативную реализацию из RTOS использовать там где она реализована. Таким образом к первым версиям RTOS других платформ не требуется реализация всего и вся - это просто доработка для повышения производительности.
Важно! Проект в состоянии альфа версии и я несколько месяцев не обновлял его на GitHub'е.
То, что вы там найдете - не будет соответствовать этому посту.
Прошу подождать, я планирую в течении недели выложить все свои доработки.
Сегодня я решил поделиться хорошей новостью - у меня успешно (без ошибок) отработал очередной пример написанный на моем языке J8B (близкий к синтаксису Java).
Я чуть более года создаю тулкит, который обойдет по многим важным аспектам существующие современные решения используемые для разработки программ (прошивок) на 8-битные микроконтроллеры (для начала). Ссылки на open source проект смотрите в конце поста.
Сейчас я акцентирую внимание на функционале и чаще всего для тестирования использую ATmega328p (он же используется в Arduino UNO), однако этот тулкит имеет все архитектурные возможности для мультиплатформенного кодинга (в том числе, в будущем, и для 32 битных микроконтроллеров)
Итак, я хочу рассказать о конкретном примере - опросе многим известного датчика температуры и влажности DHT11.
Картинка с просторов интернета модуля датчика DHT11 для Arduino
И здесь нет никаких сложностей. В интернете есть множество примеров и скетчей для Arduino с использованием этого датчика. И поэтому его опрос легко реализовать на Си и даже на Ассемблере.
Но что если я хочу писать не на Си и Ассемблере, а на высокоуровневом ООП языке схожим синтаксисом с Java? Что если я не хочу знать как работает серийный порт, что такое прерывания и как переносить мою программу с одного чипа на другой? А еще больше я не хочу погружаться в тяжелый синтаксис Си и тем более ассемблера.
Я хочу использовать язык похожий на Java, чтобы он был максимально безопасен: чтобы моя программа не падала из-за выхода за границы массивов, чтобы я мог отслеживать переполнения примитивов, чтобы у меня была нормальная работа с исключениями. И я не хочу постоянно заботиться о выделении и освобождении памяти - из-за этого постоянно куча трудно диагностируемых ошибок, особенно если добавить еще работу с указателями. А еще я хочу композицию, потому что полноценное наследование неоправданно дорого, особенно для 8-битных микроконтроллеров. Т.е. я хочу работать с объектами, хочу передавать их в методы не заботясь кто именно их реализует.
В J8B нет наследования классов - оно сильно
усложнило бы кодогенерацию, раздуло код и съело бы такты на анализ.
Вместо этого я оставил наследование только для интерфейсов. А вся
объектная модель строится через композицию. Это даёт предсказуемые
расходы памяти и времени - вы платите ровно за то, что реально
используете.
И поэтому мой пример выглядит вот так:
Пример опроса датчика DHT11 на языке j8b
Для сравнения приведу пример подобного опроса на Arduino (язык Си):
Один из многочисленных примеров на Си (лично я его не проверял)
Судить о том что лучше, функциональнее, надежнее и в том числе что привычней, предлагаю вам. Однако, это был бы не совсем честный взгляд, если не заглянуть в реализацию самой библиотеки датчика.
Вот моя мультиплатформенная реализация класса - маловероятно что она вообще потребует какие-либо изменений при смене одного чипа на другой, например при переходе с ATmega328p на STM8 или ESP32 - написано один раз - будет работать практически везде.
Это черновой код - он только-только прошел первое успешное тестирование
Как видите, этот код уже поддерживает мультиплатформенность, многопоточность, композицию, исключения, работу с безопасными массивами, легковесный примитив дробного типа fixed (Q7.8) и полностью отвязан от аппаратных особенностей МК.
И конечно обязательно нужно сказать о цене. Какова цена этим высокоуровневым фичам?
Килобайты ОЗУ, флеша? Компиляция в 5 минут? Сложные настройки компиляции и оптимизации?
Давайте посмотрим.
Размер занятого FLASH - 2947 байта (9.3%) - это не просто опрос датчика - здесь также множество универсальных библиотек RTOS которые будут использованы повторно в больших проектах. Можно снизить размер прошивки где-то еще на 100 байт указав опцию -Dj8b.bldrApiReuse=true для использования функций бутлоадера убрав их из основной прошивки.
Также мы видим весь процесс настройки проекта и его команды сборки: mvn j8b:run -Parduino-uno
Конечно настройки есть, и их много - их можно прописать в pom файле maven'а или использовать отдельные утилиты сборки, ассемблирования и прошивки. Но для обычной прошивки достаточно только одной команды Мейвена с параметром платформы (необходим установленный vm5277 бутлоадер - что делается тоже легко).
Чуть подробный вывод сборки, по которому можно судить о скорости сборки и прошивки проекта:
Первый скриншот процесса сборки и прошивки
Здесь мы видим, что компиляция прошла за 0.254 секунды, а ассемблирование за 0.202 секунды.
Второй скриншот сборки и прошивки
А здесь процесс прошивки, который длился 0.267 секунд.
В итоге, с учетом запуска Maven - сборка выполняется где-то за секунду. Этот процесс можно сильно сократить пользуясь утилитами напрямую (особенно если их собрать в нативный код с помощью GraalVM)
И последнее - расход памяти:
Здесь добавлен вывод System.showDRAMMap(); - показывает занятые биты карты динамической памяти: 011100... т.е. занято 3 блока по 8 байт каждый - 24 байта. Они ушли на заголовок и кучу экземпляра класса DHT11.
В данной конфигурации динамическая память занимает 1755 байт, общий стек - 192 байта, бит карта - 27 байт. Остальное (74 байта) ушло на служебные нужды RTOS.
Хочу также обратить внимание - сейчас у меня в приоритете функционал. Процесс оптимизации - это задача на будущее. Т.е. я планирую в будущем добиться еще лучше показателей.
Еще я хотел бы обратить ваше внимание на производительность. Понятно, что реализация высокоуровневого языка, и тем более ООП языка, требует дополнительных расходов - например процессорного времени.
Однако это не стоит дорого, потому что с таким архитектурным подходом можно смело разделить бизнес логику (которая не требует производительности железа) и низкоуровневую логику - которая создается прямо на ассемблере в RTOS.
Например - зачем писать подсчет CRC8 на уровне бизнес логики, когда ее можно оптимально и красиво написать на ассемблере и предоставить прикладнику в виде нативного метода. При этом никто не мешает, при необходимости, написать аналогичный код на j8b.
Таким образом - там где нужна бизнес логика - прикладник получает высокоуровневый, легко читаемый и надежный язык (защищающий от многих низкоуровневых ошибок), а продвинутый гуру - возможность дополнять низкий(нативный) уровень высокоэффективным ассемблерным кодом.
Я могу очень долго рассказывать о своем проекте. И уверен, что многие мои рассказы будут по началу вызывать скепсис. Но чем глубже Вы проникнитесь в мое решение тем интересней оно будет.
Но стоит сказать - это альфа версия. В ней много ошибок, много недоработок, плохая оптимизация и пока поддерживается только AVR. Однако, эта альфа уже доказывает корректно продуманную архитектуру и способность генерировать конечный рабочий результат.
И напоследок я хочу показать несколько скриншотов основного инструмента разработки на моем J8B языке и ассемблере:
Основная библиотека языка (Runtime)
RTOS для AVR
Сгенерированный ассемблерный файл примера с датчиком DHT11
Настройка параметров сборки/запуска
Прошивка бутлоадера
Создание нового проекта
И да, это IntelliJ IDEA 2025.2.6.2 (Community Edition) с моим плагином (пока не поддерживает семантику языка). Также есть плагин для NetBeans - но похоже я не будут его поддерживать дальше, по крайней мере в ближайшее время. Разработка плагина для IDEA гораздо менее трудозатратна.
В общем я просто хотел поделиться своим достижением, я очень рад что уровень проработки всех мои компонентов позволил мне собрать этот код в рабочую прошивку.
Важно! Я несколько месяцев не обновлял проект на GitHub'е.
То, что вы там найдете - не будет соответствовать этому посту.
Прошу подождать, я планирую в течении недели выложить все свои доработки.
Здравствуйте! В одном из постов про Элегию (самый свежий тык >>тут<< говорил, что изготавливаю платы для своих поделок методом ЛУТ и даже обещал рассказать что это такое. В путь...
Немного теории, постараюсь не грузить. Любая монтажная плата состоит из 2-х частей: изолятора (текстолит) и проводника (медь). В магазинах продаются пластины текстолита полностью покрытые медью (фольгированный текстолит)
Он самый, запасы достались по наследству
Вопрос: как убрать лишнее? Деды/отцы рисовали поверх платы лаком (цапон, но подойдет и для ногтей), а потом кидали в озотную кислоту или хлорное железо, реагент растворяет медь не покрытую лаком, потом смываем лак и сверлим, паяем, в общем вояем Изобретение лазерного принтера немного облегчило задачу, оказалось, что реагент не растворяет тонер, можно нарисовать в компе, респечатать и перенести. вопрос как перенести? оказалось, что печатать нужно на обратной стороне самоклейки и переводить утюгом. все гениальное просто! ЛУТ: лазерно-утюжная технология
Мне тут на работе понадобилось изготовить простенькое
рисуем схему
рисуем плату
распечатываем
отрезаем, зачищаем текстолит
переводим
перевели и удалили лишнюю бумагу
тонер не очень, обвел маркером
после хлорного железа
просверлил,вставил, припоял
другая сторона
P.S.: утюг и психика моей жены не пострадали - они привыкшие :)
Ну что? Продолжим насиловать логику? Предлагаю повысить ставки, и выходить на новые уровни сложности. Как вам такой вариант? В начале будут простые загадки, но к концу они усложнятся, предупреждаю сразу. Делитесь, пожалуйста, своими впечатлениями. Кому что понравилось, а что вызвало ступор? И кто сколько отгадал?
1. Представьте, Вы заперты в комнате из которой есть три выхода. А) За этой дверью бушует пожар. Б) За этой дверью львы, которые не ели три месяца. В) За этой дверью водоём кишащий крокодилами. Какую дверь выберете?
3. Ёмкость наполняется водой. Каждый день её объём увеличивается вдвое. Через 37 дней ёмкость наполнится полностью. Сколько дней потребуется чтобы заполнить ёмкость на половину?
Ответ.
36
4. МамЛада решила угостить друзей своим фирменным салатом. Она взяла три перца, столько же помидоров. Огурцов она взяла больше чем редиса, но меньше чем томатов. Сколько всего овощей использовала МамЛада для своего салата?
Ответ.
9
Перцев - 3
Томатов - 3
Огурцов - 2
Редис - 1
5. На улице стоят три дома — красный, синий и зелёный. В каждом живёт один человек разной национальности: британец, немец и норвежец. Британец живёт в красном доме. Норвежец не живёт в синем доме. Кто живёт в зелёном доме?
Ответ.
Норвежец.
6. Вы, с вокзала, едете на электричке. Каждые пять минут вам попадаются встречные электрички. Сколько электричек прибывает на вокзал каждый час при условии, что скорости всех электричек одинаковы?
Ответ.
6.
Дело в том, что ваша электричка тоже движется, с той же скоростью что и встречные. А значит они встречаются в два раза быстрее.
7. Каспер, Стефан и Януш предложили подвезти вас до дома. Двое из них хотят вас убить. Один — нет. Кроме того, вам известно, что как минимум один из этой троицы всегда врет (и это никак не связано с тем, хочет ли этот человек вас убить). Вам нужно выбрать, с кем поехать, чтобы добраться домой живым. Каспер говорит, что Стефан и Януш говорят правду. Стефан заявляет: «Если хочешь жить, выбери Каспера или Януша». Януш советует не выбирать Стефана, если вам хочется жить. Кого из троих нужно выбрать?
Ответ.
Не самая простая задача, не так ли?
Выбрать нужно Стефана.
Если Каспер говорит правду, то значит остальные тоже говорят правду, а это противоречит условию. Если он врёт, то значит и остальные говорят неправду.А раз Стефан говорит неправду, то значит, что нам не нужно выбирать ни Каспера, ни Януша.А кого советует выбирать Януш? Значит, именно Стефан нам и нужен.
В остальных случаях возникает противоречие с условием, что кто-то один точно врёт.
8. Колю, Сашу и Юру допрашивали в связи с угоном велосипеда. Коля сказал, что велосипед украл Саша. Саша заявил, что он невиновен. Юра сказал, что и он не вор. Известно, что только один из ребят сказал правду. Кто угнал велосипед?
Ответ.
Задача подобна предыдущей, но слегка заковырестей.
Злостный угонщик - Юра.
Здесь так же всё упирается в условие, что только один говорит правду.
9. Прошлым вечером Андрей отправился на концерт, Борис провел всё время с Ольгой, Сергей так и не увиделся с Ритой, которая посмотрела спектакль в театре, а Полина сходила в кино. Кроме тех, кого мы уже назвали, постоянными членами компании были Дима и Света. Вместе с каждым из юношей на том же виде культурных развлечений побывала одна девушка. Какая-то пара посетила художественную выставку. Где были Борис и Ольга?
Ответ.
Разумеется самые сложные задачи я честно спёр из интернета.
Здесь всё просто. Борис и Ольга были на выставке.
У нас есть четыре пары и четыре места.
Андрей - концерт
Рита - театр
Полина - кино
А раз Борис был всё время с Ольгой, то и остаётся выставка.
10. На дружеские посиделки собрались четыре супружеские пары. За вечер Диана съела три конфеты, Элизабет — две, Николь — четыре, а Мод — одну. Симон съел столько, сколько и его жена, Пьер — вдвое больше своей жены, Луи — в три раза больше своей жены, Кристиан — в четыре раза больше своей жены. Если все присутствующие съели вместе 32 конфеты, то не могли бы вы сказать, как зовут жену Луи?
Ответ.
Эту задачу я смог решить только с помощью экселя, да и то методом перебора. Может кто-то подскажет какую математическую формулу нужно использовать?
Мод - жена Луи.
Как же я решал? Всего существует 24 комбинации чисел, которые должны дать в сумме 22 конфеты. А поскольку я честно пытался найти нужную комбинацию в уме, то быстро утомился, поэтому использовал читерский метод с подстановкой цифр.В итоге единственная комбинация, которая даёт нужный результат такая:
3 - 4 - 1 - 2 Симон съел 3 конфеты, Пьер - 8, Луи - 3, Кристиан - 8.А из условия мы знаем, что Луи съел втрое больше своей жены, значит его жена съела только одну конфету, видимо за фигурой следит, а значит это Мод.
Надеюсь понравилось?
P.S. Вот что нашёл на просторах интернета. полезные советы по решению задач на логику:
Умение решать задачи — это навык, а не врождённый талант. Его можно развить, придерживаясь нескольких принципов.
1. Читайте условие дважды. Большинство ошибок происходит из-за невнимательного чтения. Перечитайте медленно и выпишите все ограничения.
2. Составляйте таблицу или схему. Для дедуктивных задач нарисуйте сетку и заполняйте её методом исключения. Визуализация помогает не запутаться.
3. Ищите противоречия. Если ваше предположение ведёт к противоречию — оно неверное. Это «метод от противного» — один из ключевых инструментов логики.
4. Начинайте с самого жёсткого ограничения. Выберите условие, которое оставляет меньше всего вариантов, и идите от него.
5. Не доверяйте интуиции. Многие задачи специально сформулированы так, чтобы очевидный ответ был неверным. Всегда проверяйте ответ подстановкой обратно в условие.
6. Решайте регулярно. Даже 10–15 минут логических задач в день ощутимо улучшают навык за несколько недель.
Вы думали, что до 9 декабря я буду сидеть дома? Я тоже так думала. Но фигушки мне.
Позавчера позвонили и сказали, что 5 декабря мне надо быть в санатории. И на все формальности у меня два дня. И сразу часть планов моих рухнуло, а некоторые стали очень неустойчивыми. Например, у нас куплены билеты на Рок-мюзикл Todd, который должен состояться 7 декабря. Мы ждали этого мероприятия с лета. Придётся на сутки сбежать из санатория. Надеюсь, что пройдёт этот номер безболезненно.
После звонка началась беготня по поликлинике. Сначала пошла в кабинет к зам главврача по лечебной части. Она отдала лист бумаги с записью "закрыть больничный по 5 кодом 31". И велела идти к заведующей поликлиники Евгении Викторовне, сказав: - Она знает, что делать.
Заведующая поликлиники куда-то очень торопилась:
- Ты не обижайся, но мне сейчас очень некогда. Иди к другой заведующей в кабинет 310. Она всё сделает.
Пошла в 310 кабинет, но мне там отказали:
- На счёт путёвки это не ко мне. Я ими не занимаюсь.
- Так путёвку мне уже дали. И послали к Евгении Викторовне, но она велела к Вам идти. Здесь надо больничный закрыть через код 31 и оформить электронное направление на лечение в санаторий, затем его распечатать.
- С каким заболеванием?
- Так желчный мне удалили, вот, - напомнила я слова, сказанные мной ранее.
- А я то здесь при чём? Я по лечебной части, а раз уже удалили, то идите к хирургу. Медсестра всё сделает - она всё умеет.
И пошла я в кабинет хирурга. Медсестра всё знала и умела, кроме как исправлять электронный лист нетрудоспособности. Позвонила к кому-то и обрисовав ситуацию, что-то выслушала и положила трубочку. Потом сказала мне:
- Направление оформлю, а вот больничный закрывать пятым числом не буду. Для этого придется его полностью удалять, а затем бежать подписывать у того, кто тебе его выписывал. Тот ещё геморрой. Тебе его спокойно в санатории закроют, а затем откроют свой. Если что - вот тебе мой номер телефона, звони.
- Эээээ. Так я без зарплаты совсем могу остаться. На больничный ушла в ноябре после отпуска (отработала всего 3 смены), а зарплату за ноябрь и декабрь выдадут в середине декабря. Новый год ведь. А январскую зарплату получу только в феврале. Высад.
- Не переживай. Как больничный закроют, так в отдел кадров позвони и номер скажи. Они его проведут и получишь свои денежки ещё в декабре.
Как хорошо, что есть телефонная связь! Я пошла узнавать телефон, по которому я смогу своего кадровика предупредить о окончании больничного. Наша сотрудница отдела кадров дала мне номер своего личного телефона:
- Звони и пиши в ВК. Буду ждать.
Затем я стала читать отзывы о санатории. Тот, куда я поехала, называется Маян. Отзывы очень противоречивые. Одни его хвалят, другие ругают. Основная жалоба - кормят плохо и развлечений нет. А то, что это больница, в которой осуществляется санаторно-курортное лечение никто не учитывает. Но я то лечиться еду, а не развлекаться.
В поликлинике встретила двух знакомых, похвасталась им тем, что еду в Маян. Одна сказала:
- Это там, где не кормят?
- Точно так, - ответила другая, и засмеялась.
- Смейтесь, смейтесь, - заулыбалась я. - Потом завидовать будете. Вернусь стройная как кипарис.
А сама подумала, что может верно жалуются.
В санаторий решила ехать на поезде. Туда надо было прибыть с 10 до 12 часов. Правда в устной форме сказали "хоть во сколько". Но я решила соблюсти правила. А это значит, что выезжать надо рано утром. Выбрала поездку поездом до Талицы, а потом на такси (или маршрутке).
Итак. В 4 утра подъём, в 5 часов вызов такси, в 6:02 поезд "Москва - Абакан". И спать. За полчаса до прибытия меня разбудила проводница. На выходе с вокзала подошёл таксист, и я воспользовалась его услугами. По дороге в Маян узнала, что санатория здесь два. Один - областная больница, а другой от железнодорожной дороги. Тот, который от РЖД, со слов таксиста, гораздо хуже. Возможно, что негативные отзывы были о нём. Посмотрим.
На данный момент я уже заселилась в палату. Вот фото.
Кровать у стены - моя.
О своих впечатлениях напишу потом, когда вылечусь.
P.S. Это последняя запись моего дневника, которую я нашла. Посмотрю ещё. Если найду - будет продолжение.
И причина по которой я не выкладывала
рисунки полгода. Полгода я рисовала только ее. Я очень люблю хорошие
детские книжки и эсперанто, и когда в мои руки попали стихи, а потом и
сказки Татьяны, со мной случилось то, что всегда случается от хороших
детских книжек - герои начали оживать и проситься на бумагу. И вот,
спустя месяцы работы, она появилась, детская книжечка на эсперанто с
шестью десятками моих иллюстраций.
Об этой работе и отдельных картинках я еще ни раз расскажу :)
Острословие, в переводе на áнглицкую мову, выглядит как "wit", исполнителей с таким названием, точнее сказать, с этим словом в названии, я нашёл массу. Но вот деятелей металлического плана, не нашёл. Соглашусь, возможно плохо искал. Зато нашёл одну группу, под самоназванием "Mizmor". Так вот, у них есть композиция под названием "Wit's End". То бишь, "Конец острословию/я". Послушаем? Почему бы и нет? Песенка-то коротенькая. Всего лишь, без двух секунд, пятнадцать минут. Да, свою композицию, они самоопределили сами, как black/doom metal, но на мой, сугубо скромный взгляд, это не что иное как sludge metal, медленный, тягучий, как гудрон, мрачный, как закопчённое стекло, металл. Очень атмосферный. Порой, это то, что нужно. Тогда, когда хочется замедлиться, и тогда, когда хочется отдохновения от бесконечного беличьего колеса. И тут, сам по себе, возникает вопрос - "а зачем это всё?". И вот, вы уже находитесь наедине с самим/самой собой и своими мыслями (если они есть). А что может быть лучше беседы с прекрасным человеком? Да, это лучше слушать в одиночестве. Так эффект намного сильнее. Mizmor - Wit's End Ютруп.
Рутруп, разложившись на плесень и мёд, держит марку незнания. Как натуральная блондинка с IQ 76.
ВК днина, в очередной раз удручает своей оптимизацией, но при этом может предложить другую композицию. Не менее мрачную, депрессивную и тягучую. Вот ту, да, присутствуют элементы black metal, но самую малость. MIZMOR - No Place To Arrive (official video)
Делитесь, пожалуйста, своим впечатлениями в комментариях. Мне так хоть проще будет понимать, в какую сторону копать. Ну или не делитесь, мне так будет проще понимать, кому копать.