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

Если бы от меня требовали количество в ущерб качеству, я бы сам ушел.

У меня получается в среднем менее 10 строк в день. Но это вместе с проектированием.
И именно в среднем. Обычно чередуются “скрытые” и “активные” периоды. В первые - обдумываю и созреваю, во вторые - появляется сначала текстовое описание по-русски, затем оно наполняется кодом, а текст становится комментариями.
Соотношение времени примерно 4 к 1.

Да отбросим скромность :).

Сейчас посмотрел на простую функцию - читает строчку из файла. getline() называется.

// Mock GNU getline()
//
static int files_getline(char **buf, unsigned int *size, FILE *fp) {

  int c;
  char *wp, *end;

  // no buffer provided? allocate our own
  if (*buf == NULL)
    if ((*buf = (char *)q_malloc((*size = 128), MEM_GETLINE)) == NULL)
      return -1;

  if (feof(fp))
    return -1;

  wp = *buf;           // buffer write pointer
  end = *buf + *size;  // buffer end pointer

  while (true) {

    c = fgetc(fp);

    // end of line or end of file? return what was read so far
    if ((c < 0) || (c == '\n')) {
      *wp = '\0';
      return (wp - *buf);
    }

    //skip Microsoft-style line endings and save byte to the buffer

    if (c == '\r')
      continue;
    *wp++ = c;

    // do we still have space to store 1 character + '\0'?
    // if not - increase buffer size two times
    if (wp + sizeof(char) + sizeof(char) >= end) {

      char *tmp;
      int written_so_far = wp - *buf;

      if ((tmp = (char *)q_realloc(*buf, (*size *= 2), MEM_GETLINE)) == NULL)
        return -1;

      // update pointers
      *buf = tmp;
      end = tmp + *size;
      wp = tmp + written_so_far;
    }
  }
}

Даже если выкинуть комментарии, будет >40 строк. На написание функции и ее отладку (отлаживаюсь на на host машине, на Cygwin, потом уже переношу в Ардуино среду) у меня ушел ну, может, час. Скорее всего - значительно меньше. И у вас, я уверен, ушло бы не больше времени. Не, если работодателя устраивает такой темп - то я только обеими руками “За!“. Я бы и сам стал так же писать - куда торопиться? Кто жизнь понял - тот не торопится :slight_smile:

Хотя, конечно, строчки бывают разные. Иногда и 10 строчек вымучиваешь сутки.

Это время мы учитывать не будем :). Иногда долго созреваешь :smiley:

Ну да, если целенаправленно вычленять только время ударов пальцев по клавиатуре, получатся совсем другие цифры.

По поводу “учета”:
Тут ведь вопрос не только в том, как учитывать время, но и в том, как учитывать код.
Например, юнит-тесты могут быть объемнее того кода, что предусмотрен ТЗ, но их объем в количестве написанного кода не учитывается.

Возвращаясь к Ардуино: я обратил внимание, что для проекта на Ардуино я пишу для ПК раз в 10 больше кода, чем, кобственно, для Ардуино.
Вот, например, здесь:

на ПК была написана программа, которая:

  1. Читает и разбирает MIDI файл.
  2. Делает аранжировку с учетом возможностей и особенностей инструмента.
  3. Переводит партитуру из MIDI в числа, которые используются для управления инструментом.
  4. Выводит посчитанный массив в текстовый файл, который затем будет включен с скетч.

И это еще не все.
Была также написана другая программа, которая, используя насчитанный предыдущей программой массив констант, эмулировала инструмент и записывала результат работы в *.wav файл, чтобы можно было послушать, как примерно будет звучать инструмент, не прошивая Ардуинку.
И это только то, что я сейчас навскидку вспомнил.

Попробовал, короче, писать по 10 строк в день. Написал пока иконки в файловый менеджер. И сделал счетчик перезагрузок, который обнуляется только если выдернуть питание (ну или кнопку reset нажать). Перезагрузки и перепрошивки счетчик не обнуляют

Крутая штука!

Попросил ЧатЖПТ перевести все на русский. Вроде справился :slight_smile:

Год и четыре месяца потребовалось, чтобы отравить ИИ. Отравленец - один человек, с одним ноутбуком:

Сделал возможность создавать переменные и ассоциировать их с памятью. Обычные переменные шел позволяет читать\писать (командами шелла, я выше где-то постил), но вот писать по произвольному месту в памяти - такого я не делал. Не знакл, как.

А сейчас придумал. Допустим, мы хотим иметь доступ к памяти по адресу 0x3fce4000 , как будто у нас там “unsigned int“, а еще мы хотим доступ к памяти 0x3fce4004, как будто у нас там массив на 64 unsigned int.

Создаем две переменные: foo и bar

Теперь можно смотреть значение в памяти, как значение переменной. Можно менять теми же командами. Например: вывести текущее значение , поменять его на 10, и проверить, записалось ли:

А вот наш массив, переменная bar. Доступ к отдельным элементам массива - так же, как и раньше: “var bar[666] 10“ ← установить 666-й элемент в значение 10.

Поддерживаются следующие типы: скалярные (“uint16_t“, “signed short int“, “unsigned long“ и тому подобные), указатели (“signed short *“, например), массивы (“int [ \] “), массивы указателей: (“void x [ \]“ , звездочка вместо x) и .и.п.

Зачем я это сделал: я сейчас ковыряюсь со структурами в памяти (драйвер WiFi). Структуры эти - осмысленные, а не просто байтовый дамп, и мне хотелось не просто смотреть память в виде C-типов, но и писать в память. Писать, не задумываясь о порядке байтов и прочем.

Можно, например, замаппить переменную на регистры UARTа и лазить по ним, как по массиву.

Пока еще мелкию огрехи вылазят наружу, но думаю, скоро допилу и закоммичу.

Сюда бы еще nfs и dd - круто было бы.

Реально крутая штука!
Два терминала - зачётная вещь!!!
Благодарю!!!

А если в espshell.h исправить строчку где-то в начале файла “#define WITH_LANG 0” на “#define WITH_LANG 1” то какая-то часть шелла (бОльшая, но не целиком) станет говорить по-русски :). Команды набирать целиком не обязательно, кстати. Я, кстати, не пробовал делать раздельный вывод, как у тебя. Приятно осознавать, что оно работает в таком режиме :))).

вот разобрался, оказывается строчка что занято столько-то из 16 мегабайт памяти никакого отношения к действительно выделенной памяти не имеет, так написано в профиле CUSTOM - вся память программ 16 мегабайт

Можно то же самое, только по-русски?

Скетч использует 385822 байт (2%) памяти устройства. Всего доступно 16777216 байт.
Глобальные переменные используют 21892 байт (6%) динамической памяти, оставляя 305788 байт для локальных переменных. Максимум: 327680 байт