Espshell : отладочный инструментарий для ESP32

Да, пришлось.

Когда размер файла стукнулся в 300к было принято решение сделать либу.
Заодно нашел баг в Ардуино ИДЕ, отрепортил. Пришлось файлы переименовывать все из .c в .h. Иначе внутряння ошибка в Ардуино ИДЕ при парсинге файлов.

Хреновый у них function prototype generator. Кстати, непонятно, зачем они свой парсер писали, который об GCCшные экстеншны спотыкается. Взяли бы что-нибудь из GNU Compiler Collection, там есть генераторы прототипов.

Достаточно просто включить заголовочный файл шелла, чтобы шелл автоматически запустился. Собственно, #include “espshell.h” и больше ничего не надо.

Поменял частотомер\счетчик импульсов: теперь их можно запускать параллельно (до 8 штук на оригинальном, и поменьше на S3 и всяких кастратах типа C3, C6).

Частотомер может работать в режиме триггера: ждать первого входного импульса и только потом засекать время и считать.

Команда suspend теперь умеет останавливать не только скетч, но и вообще любую задачу, если знаете ее ID. Команда kill больше стала похожа на Linux утилиту по синтаксису.

Из шелла можно смотреть\менять переменные скетча.

Если в процессе набора команды нажать вопросик, то появится подсказка по аргументам команды. Если такой хоткей мешает (например, вы AT команды набираете, там бывают вопросики, или xml файл редактируете), то его можно отключить (“var bypass_qm 1”).

Файловый менеджер все так же не умеет копировать каталог в каталог (ну, в смысле, все дерево каталогов). Зато можно маунтить флешки (SD) по SPI :). Кто бы мог подумать, что ФМ это такой долгий гемморой :-/.

Было принято решение приклеить туда еще примитивный ftp сервер, однопользовательский. Обоснование простое: сильно упрощается работа с файлами, т.к. большинство файловых менеджеров на PC поддерживают так или иначе FTP.

Удобнее работать из какого-нибудь условного Far’a, например, когда вам в html страницах вашего embedded HTTP сервера приходится чего-нибудь редактировать, файлы туда-сюда гонять.

Какие-то еще были улучшения, но я уже забыл, что и как.

Мне приехала ESP32S3 USB-OTG борда, буду запиливать злощастную USB консоль. Вроде нашел функции-примитивы для работы с USB CDC в самом ESP32S3, вернее, в его ROM.

2 лайка

в смысле? заголовочные файлы не должны содержать сам код, только прототипы, разве нет?

Нет.

Имплементацию в заголовочных файлах никто не запрещал.

Правильный путь — это конечно вынести прототипы отдельно, а имплементацию отдельно. Таким путём вы получаете преимущества раздельной компиляции: ваши функции компилируются отдельно, лишь один раз.
В случае, когда функции находятся в header’е, они будут компилироваться каждый раз при включении этого самого header’а. Кроме того, вам придётся каждую функцию обозначить как inline, чтобы компоновщик не ругался на множественные определения. Если таковые имеют место быть.

Ну вот такая жизнь.

Думал вообще в .тхт переименовать сначала, но тогда бы подсветка синтаксиса пропала

Хорошая шутка)

Пока не встроешь Байсик или Форт или что-то вроде - нещщитова! :wink: Байсик в Радио86-РК, как я помню, влезал в 8К ПЗУ, так что ннада. Форт еще компактнее, хотя плюс-минус пофигу.

2 лайка

Если структура продумана, лично я ничего плохого в имплементации в .h файле не вижу.

полагаю, запреты подобного рода будут подобны запретам стрелять себе в ногу)

С Foth достаточно сложная реализация. Есть большая проблема с классической компиляцией определений. Дл 8080 это было просто, поскольку нет разницы в коде и данных. Опять же в Fofth достаточно сложно реализовывать работу с прерываниями. Даже для 8080 было 2 версии, которые разработали в ЛГУ, которые осуществляли разную схему обработки прерываний.

можно в отдельный код выделить, пригодилось бы народу

Доработал часть шелла, отвечающую за доступ к переменным скетча.

Переменные нужно зарегистрировать (есть макрос специальный) и пользовать из шелла.

Например, посмотреть, список всех переменных:

Посмотреть значение переменной по указателю, или содержимое массива:

Точно так же можно и устанавливать значения переменных:

Если осилю hardware watchpoints, то добавлю триггеры на значения переменных. Или не добавлю :).

Типичный пример использования в скетче (регистрация переменных).

Если в файле espshell.h установить значение макро WITH_VAR в 0, то код регистрации переменных будет вырезан из релиза.

С Новым Годом!

2 лайка

Ну и наконец-то выложил в общий доступ.
Теперь можно загрузить из Arduino IDE, из Library Manager. :0)

2 лайка

Наконец-то доделал доступ к переменным из командной строки. Оно и раньше работало, но вот обратиться к элементу массива было нельзя. Посмотреть - можно, изменить - нет.

А теперь все заработало. Массивы, конечно, только одномерные. Типы данных - только простые (int, float, unsigned/signed, char и т.п.)

Сделал кое-какой контроль за вводом пользователя: раньше, если пользователь делал неочевидный запрос, то ему возвращалась первая попавшаяся. А теперь мы умничать будем:

Уверенно двигаемся к версии 1.0 :).

А в версии 2.0 думаю отказаться от Arduino Core вовсе, чтобы шелл собирался не только в фреймворке Ардуино, но и в голом ESP-IDF тоже.

Ну а с документацией все как всегда - начал за здравие… Но сил пока хватает только на английскую версию. Русская устарела безнадежно :-/

1 лайк

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

2 лайка

Большое спасибо! :).

ESPShell 0.99.7:

Добавил поддержку USB Serial. Теперь должно работать на Nano ESP32.
Добавил фильтр в частотомер
Сломал поддержку камер, но скоро исправлю: раньше поддерживалась только ESPCAM, скоро будут поддерживаться все :).

На моей нонейм борде Esp32S3 USB-OTG DevKit - работает. Забавно, что USBшная консоль (CDC) на глаз раз в пять быстрее отрабатывает, чем UART на 115200