Однажды мне в голову пришла бредовая идея свести 500 лазерных указок в одно место. Я потратил много времени и сделал это. Получилось зрелищно и бесполезно, но мне понравилось. Полгода назад мне пришла другая бредовая идея. На этот раз совсем не зрелищная, но гораздо полезнее. Я также потратил на неё много времени. И в этой статье я представляю бета версию своей второй бредовой идеи.
Проект я назвал Nanonyam (Наноням) и даже придумал ему логотип (рисовал целых 5 минут).
Для тех, кто мыслит терминами Arduino, можно сказать, что Nanonyam это виртуальный ардуино-шилд для управления Windows.
Другими словами, Nanonyam это виртуальная машина, в которой в качестве байт-кода используется прошивка для микроконтроллера AVR (рекомендуется ATMEGA2560). Внутри этой виртуальной машины находится симулятор ядра AVR, но вместо периферийных устройств, которые располагаются по адресам SRAM от 0x0060 до 0x01FF, находится специальный интерфейс к виртуальным функциям (в том числе функциям Windows API). И тут очень важно сразу уяснить: код для Nanonyam не должен иметь никаких обращений к указанному диапазону памяти, чтобы случайно не вызвать, например, функцию удаления файлов или форматирования диска. Остальной диапазон памяти SRAM от 0x0200 до 0xFFFF (это больше, чем в реальном микроконтроллере) доступен пользователю для любых целей. Сразу отмечу, что имеется специальная защита от случайного запуска прошивки реального микроконтроллера (или прошивки от другой архитектуры): прежде, чем активировать «опасные» функции, нужно вызвать специальную хитрую виртуальную функцию. Есть и некоторые другие элементы защиты.
Чтобы создавать программы для Nanonyam нужно использовать специальные библиотеки, в которых реализованы все доступные на данный момент виртуальные функции. Скачать виртуальную машину Nanonyam и библиотеки к ней можно тут. А вот страница описания виртуальных функций. И да, мой сайт очень примитивен и не адаптирован под мобильные устройства.
Программа Nanonyam является бесплатной для домашнего и коммерческого использования. Программа Nanonyam предоставляется на условиях «как есть». Исходный код не предоставляется.
На данный момент программа находится в стадии тестирования. Реализовано около 200 виртуальных функций, которые позволяют создавать простые программы для Windows.
Очевидно, что создавать в такой виртуальной машине что-то сложное не получится, так как памяти для кода всего лишь 256 кБ. Данные можно хранить в отдельных файлах, буфер для графической части реализован внешне. Все функции упрощены и адаптированы для 8-битной архитектуры.
Что же можно сделать в Nanonyam? Я придумал несколько задач.
Отработка программных блоков
Однажды мне нужно было разрабатывать сложное меню для графического дисплея 128x64 точки. Очень не хотелось постоянно загружать прошивку в реальный микроконтроллер, чтобы посмотреть, как выглядят пиксели. Так и родилась идея Nanonyam. На рисунке ниже изображение с реального OLED-дисплея одного из пунктов того самого меню. Теперь я могу прорабатывать его без реального устройства.
Nanonyam (в своей конечной задумке) это хороший инструмент для отработки программных блоков для микроконтроллеров, так как есть функции работы с графикой (можно имитировать дисплеи и индикаторы), с файлами (можно делать логи, считывать тестовые данные), с клавиатурой (можно считывать до 10 кнопок одновременно), с COM-портами (тут отдельный пункт).
Создание быстрых программ
Например, вам нужно по-быстренькому обработать 100500 текстовых файлов. Каждый нужно открыть, немного изменить по какому-то несложному алгоритму, сохранить и закрыть. Если вы мастер Python, то я вас поздравляю, у вас всё есть. Но если вы закоренелый ардуинщик (а таких немало), то Nanonyam вам поможет в решении этой задачи. Именно это моя вторая цель в Nanonyam: добавить множество полезных функций типа обработки текста, создания скриншотов или имитации нажатия клавиш в системе (это всё, кстати, уже есть), а также множества других функций для решения рутинных задач.
Тестирование железок через COM-порт
Nanonyam может выступать в роли терминала, работающего по вашему алгоритму. Можно нарисовать небольшое меню для управления устройством и отображать данные, получаемые из порта. Можно сохранять и считывать данные из файлов для анализа. Удобный инструмент для несложной отладки и калибровки железок, а также для создания простых виртуальных панелей управления прибором. Для студентов и молодых учёных этот проект может быть очень полезным.
Обучение программированию
Впрочем, как и во всём проекте Arduino, основная полезность Nanonyam заключается в упрощённости функций, интерфейса и загрузчика. Поэтому этот проект должен быть интересен новичкам-программистам и тем, кого устраивает уровень ардуино. Кстати, сам я до сих пор не изучил ардуино детально, поскольку всегда использовал WinAVR или AVR Studio, а начинал с ассемблера. Поэтому пример программы ниже будет немного неправильным, но вполне рабочим.
Hello, Habr!
Пришло время познакомиться с некоторыми функциями Nanonyam и написать простую программу. Будем писать в Arduino, но не так, как принято, а так, как я сейчас умею (я уже говорил, что пока не очень хорошо разобрался с этой средой). Для начала создаём новый скетч и выбираем плату Mega2560.
Сохраняем скетч в файл и рядом копируем библиотеку Nanonyam. Правильно было бы включать заголовки библиотек, но я не знаю как в Arduino прописывать компиляцию отдельных файлов, поэтому пока просто включим библиотеки напрямую (и все сразу):
#include <stdio.h>
#include "Nanonyam\nN_System_lib.c"
#include "Nanonyam\nN_Keyboard_lib.c"
#include "Nanonyam\nN_File_lib.c"
#include "Nanonyam\nN_Math_lib.c"
#include "Nanonyam\nN_Text_lib.c"
#include "Nanonyam\nN_Graphics_lib.c"
#include "Nanonyam\nN_RS232_lib.c"
Ещё правильней было бы сделать специальный модуль “Nanonyam for Arduino”, который можно устанавливать прямо из Arduino. Как только разберусь с этим, сделаю, а пока просто показываю суть работы с виртуальной машиной. Пишем такой код:
//Сразу после запуска рисуем текст в окне
void setup() {
sys_Nanonyam();//Подтверждаем код виртуальной машины
g_SetScreenSize(400,200);//Задаём размер дисплея 400х200 точек
sys_WindowSetText("Example");//Заголовок окна
g_ConfigExternalFont(0,60,1,0,0,0,"Arial");//Задаём шрифт Windows в ячейке шрифтов 0
g_SetExternalFont(0);//Выбираем ячейку шрифтов 0 для рисования текста
g_SetBackRGB(0,0,255);//Цвет фона синий
g_SetTextRGB(255,255,0);//Цвет текста жёлтый
g_ClearAll();//Очищаем экран (заливка цветом фона)
g_DrawTextCenterX(0,400,70,"Hello, Habr!");//Рисуем надпись
g_Update();//Выводим графический буфер на экран
}
//Просто ждём закрытия программы
void loop() {
sys_Delay(100);//Задержка и разгрузка процессора
}
Скетч с этой программой можно скачать тут. Детальное описание функций ищите на сайте. Надеюсь, комментариев в этом коде достаточно, чтобы понять суть. Тут функция sys_Nanonyam() играет роль «пароля» для виртуальной машины, который снимает ограничения на виртуальные функции. Без этой функции программа закроется через 3 секунды работы.
Нажимаем кнопку «Проверить» и никаких ошибок быть не должно.
Теперь нужно получить бинарный файл (прошивку). Выбираем меню "Скетч>>Экспорт бинарного файла (CTRL+ALT+S)".
При этом в папку со скетчем будет скопировано два HEX-файла. Мы берём только файл без приставки «with_bootloader.mega».
Есть несколько способов указать HEX-файл виртуальной машине Nanonyam, все они описаны на этой странице. Я предлагаю создать рядом с файлом Nanonyam.exe файл Nanonyam.path, в котором прописать полный путь до нашего HEX-файла. После чего можно запускать Nanonyam.exe. Получаем окно с нашей надписью.
Аналогично можно создавать программы в других средах, например, в AVR Studio или WinAVR.
На этом пока закончим знакомство с Nanonyam. Основная идея должна быть понятна. Ещё примеры есть на сайте. Если будет достаточно желающих использовать этот проект, то я сделаю больше примеров и продолжу «наполнять» библиотеки виртуальных функций. Принимаются конкретные идеи для развития проекта и отчёты о неисправностях, багах и ляпах. Желательно направлять их по контактам, указанным на сайте. А обсуждение приветствуется в комментариях.
Всем спасибо за внимание и удачного программирования!
Комментарии (9)
b612
28.10.2019 20:16500 лазеров 200 функций
Чего ещё можно взять много из того чего не принято брать много?
Jouretz
Это статья о том как можно писать на C под винду, но с использованием виртуальной машины эмулирующей чип ATMEGA? Я всё правильно понимаю? оО
nanoslavic Автор
Я же использовал выражение «бредовая идея». Так что, да.
pvvv
Маловато будет.
Надо теперь в этот эмулятор АВРа запихнуть эмулятор АРМа и запустить таки Линукс
hackaday.com/2012/03/28/building-the-worst-linux-pc-ever