Отладка на ардуине достала

Отладка, если это можно назвать отладкой, Васика на ардуине достала. Решил добавить к АрдуиноВасику нормальный консольный PC хост со всеми отладочными плюшками.
Вывод на консоль работает, ввода пока нет:
PC host

Код на Гитхабе в бранче pc_host

Я не понял, что именно вы отлаживаете. Сишную реализацию Бейсика ? В какой IDE вы это делали ? Как этот PC хост поможет вам ?

Отлаживаю тот же самый Ардуино-бейсик, который в плате используется. А конкретно - пытаюсь прикрутить поддержку менеджера виртуальной памяти SPI RAM, чтобы Васику было доступно не 1024 байта, а 64 КБ или выше. Ковырять на самой ардуине сложно, поэтому ПЦ хост сильно облегчает задачу.

Пользуюсь опенсорсным Code Blocks.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

c её возможностями не используется?

В данном случае хочу только free и опенсорс использовать.
Да и зачем - логику работы, наверное, я смогу под PC отладить

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

От CodeBlocks я избавился после надоевшей постоянной борьбы с косяками в пользу QtCreator, где все более-менее живет. Но это было под линуксом, где за пределами Vim выбор невелик. Под винду я бы не задумываясь поставил бесплатную полнофункциональную VS community.

VS community у меня стоит на домашнем компе, отличная система. Но на виндовой планшетке места мало, а это у меня "основной" комп за столом в гостиной, поэтому CodeBlocks там прижился нормально. Кстати, его последняя версия (17.х) подвылизана хорошо.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

или это эмулятор AVR какой то ? И на нём SPI корректно эмулируется с памятью ?

Да, это тот же самый Бейсик, что у меня на Ардуино-шилде вертится, просто вместо Ардуины работает в писишную консоль.
На шилде стоит 128 КБ SPI память. И мне захотелось прикрутить виртуальную память (
https://github.com/rhelmus/virtmem)

Вот мои эксперименты на ардуине, выделено 128000 байт для виртуального буфера памяти:

char testbuf[] = "This is a test string buffer\nThis is a test string buffer\nThis is a test string buffer\nThis is a test string buffer\nThis is a test string buffer\nThis is a test string buffer\nThis is a test string buffer";
    
    // Allocate a char buffer in virtual memory and store the address to a virtual pointer
    VPtr str = valloc.alloc(128000);    
    VPtr ptr = str;

    // Set 'A' to first 65000 bytes of the buffer 
    memset(str, 'A', 65000);
    Serial.print("Read from str[0]: "); Serial.println(str[0]);

    // Get byte from the offset 10 of virtual pointer 
    char a= *(ptr + 10);
    Serial.print("char a= *(ptr + 10): "); Serial.println(a);

    // Set 'H' to the offset 100000 of virtual pointer 
    *(ptr + 100000) = 'H';
    char h = *(ptr + 100000);
    Serial.print("char h = *(ptr + 100000): "); Serial.println(h);

    // Set 'B' to array index 60000
    str[60000] = 'B';
    Serial.print("Read from str[60000]: "); Serial.println(str[60000]);

    // Set 'C' to array index 126000
    str[126000] = 'C';
    Serial.print("Read from str[126000]: "); Serial.println(str[126000]);

   // Copy another buffer in to the virtual buffer
    memcpy(&str[127200], testbuf, sizeof(testbuf));
    memset(testbuf, 0, sizeof(testbuf));
    memcpy(testbuf, &str[127200], sizeof(testbuf));
    Serial.print("Read from str[127200]: "); Serial.println(testbuf);

    valloc.free(str); // Free the virtual memory

Результат работы:

char a= *(ptr + 10): A
char h = *(ptr + 100000): H
Read from str[60000]: B
Read from str[126000]: C
Read from str[127200]: This is a test string buffer
This is a test string buffer
This is a test string buffer
This is a test string buffer
This is a test string buffer
This is a test string buffer
This is a test string buffer

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

PC хост заработал (не полностью - DEL, ESC не работают). Билд пока только для Windows.
хост 1

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

https://geektimes.ru/post/263614/

Выдержка "О чем идет речь

Данный проект является виртуальной машиной которое эмулирует ядро процессора MSP430 с небольшими изменениями в прерываниях. Виртуальные машины позволяют разработчику отделить бизнес логику устройства от платформы устройства. Строя таким образом платоформонезависимые устройства.

Достоинства

Отделение алгоритма работы устройства от платформы устройства.
Отсутствие разных загрузчиков, программа виртуальной машины может находится на любом носителе.
Возможность строить переферию на свой вкус и цвет.
Простое создание многозадачных систем

Недостатки

Низкая скорость работы. Так как на одну инструкцию виртуальной машини приходится с два десятка инструкция хост машины."

P.S. Занимает порядка 5Кб :)
Когда то на русской страничке википедии по MSP430 набрал систему команд данной архитектуры, и на эту страничку сослался автор приведённой разработки :)

Не совсем понятно, зачем это нужно :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Немного, если сказать мягко, надоела резьба по кости с прикручиванием виртуальной SPI SRAM памяти для Васика в качестве программной памяти.
Остановился на временном решении - добавил в Васик два новых оператора:

WSRAM A,B     - записывает байт B по адресу А [0..131071]
RSRAM(A)      - читает байт из адреса А [0..131071]

Работа в PC хосте:
wrsram

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Срам-память. :-) Можно ещё там хранить строки. Строки занимают больше всего места. Мне пришлось пронумеровать сообщения, лишив их текста, чтобы Каллисто влезла в 100 страниц МК-161. Минимальная реализация:

DIM$ n, k  – выделить память для n строк, размером в k килобайт
SET$ n, a$ – присвоить строке номер n значение a$
GET$(n)    – вернуть значение строки с номером n

В идеале текст строковых констант из исходного кода компилируется тоже в SRAM. В основной памяти хранится лишь ссылка на строку во внешней памяти. Также можно вообще вынести все строки и строковые массивы во внешнюю память, сделав это прозрачным для программиста.

Операторы для хранения строк в SPI SRAM памяти это хорошая идея.
Хотя лучшим вариантом, наверное, было бы просто заменить статический буфер памяти Бэйсика на виртуальный буфер памяти. Но у меня не вышло - не все методы доступа к памяти были перегружены для работы с виртуальным буфером. Например strcpy. А там половина Бейсика основана на копировании строк и возврате строковых указателей.

Пока я остановлюсь на том, что есть.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

BASIC - это язык высокого уровня :-) Не уподобляйтесь Форту, где принято делать отдельные механизмы на каждый чих, например надо плавучие числа, зафигачим отдельный стек и операции с ним, и называть всё это разными именами. Чтобы остудить горячие головы, и не было холивара, добавлю, что в том же Common Lisp ситуация почти такая же !

В идеале память из SRAM должна выделяться автоматически. Я не понял в чём возникли проблемы с "виртуальной памятью" в SRAM ?

Это привал для отдыха, а не отступление :)
Virtual memory library for Arduino, с которой я ковырялся, не для всех операторов и функций работы с памятью имеет перезагрузку.
А Ардуино-Бэйсик полон операций с указателями и строками:

...
char *stackGetStr() {
    // returns string without popping it
    unsigned char *p = &mem[sysSTACKEND];
    int len = *(uint16_t *)(p-2);
    return (char *)(p-len-2);
}
char *stackPopStr() {
    unsigned char *p = &mem[sysSTACKEND];
    int len = *(uint16_t *)(p-2);
    sysSTACKEND -= (len+2);
    return (char *)&mem[sysSTACKEND];
}
...

В общем, я буду признателен, если кто-то сможет придумать, как можно прикрутить virtmem ко всему зоопарку указателей в Arduino-Basic.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Написать Бейсик заново, расположив всё это болото со строками в SRAM. Это простой язык, где от прошлых версий важны лишь наборы операторов, функций и операций.

Не, меня не хватит переписать Бейсик заново. Пока останусь на том, что есть, надо начинать разрабатывать финальную печатную плату.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Получается, исходный код использует операции с массивами данных в оперативной памяти микроконтроллера. А sram-память используется как устройство, с которым проводятся операции чтения-записи, но напрямую с ним работать нельзя. А драйвер виртуальной памяти не может свопить пользовательские данные в sram-память? Даже если переписать процедуры обмена с ОЗУ на sram-память, то быстродействие аппарата существенно упадёт.

Да, SPI SRAM не расширяет ОЗУ микроконтроллера. Virtmem библиотека перезагружает много операторов C++, но не всё. Переделка Васика на SPI SRAM сложна, и да, существенно замедлит скорость работы.
В общем, количество возни с заменой всей программной памяти Васика на SPI SRAM и количество минусов перевешивают количество плюсов.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

А может вообще не Бейсик родить, а что то похожее, но получше и фичастее. Например работу со структурами соорудить. Всякие форматеры и ридеры для полезных типов данных вроде матриц и структур. Для Бейсика это небольшое дополнение получится. Структуры правда могут потребовать автоматического управления памятью, но простейшие механизмы вроде всем доступны и крайне просты в реализации (аля счётчики ссылок и т.п.).

atmega328p слабовата для этого. Помимо Бэйсика и Форта, мало что можно сюда втиснуть. Разве что Bitlash.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Чёртова низкоуровневая арифметика указателей, такое можно наворотить! Неплохо бы большую часть закатать в какие то объекты(структуры) типа библиотеки выделения памяти, чтобы вручную не напутать где то. Да ещё бы и проверить, чтобы за границы допустимых адресов не выходило.
Может быть и правда проще написать свой Бейсик, не придётся вылавливать блох то там, то тут ?