ESPShell предоставляет API для регистрации и управления переменными скетча. Поддерживаются только простые типы C, такие как unsigned/signed int, char, short, float, а также указатели типа void*. Также поддерживаются массивы этих простых типов.
Чтобы переменная стала доступной в ESPShell, её необходимо зарегистрировать.
Для регистрации используется макрос convar_add(). Также существуют специализированные макросы, такие как convar_addp() для указателей и convar_adda() для массивов.
Пример использования в Arduino-скетче: допустим, у нас есть три переменные, которые мы хотим сделать доступными в командной строке shell:
static int some_variable; unsigned char *pointer; char array[10]; void setup() { ... convar_add(some_variable); ← Регистрация простой переменной convar_addp(pointer); ← Регистрация указателя convar_adda(array); ← Регистрация массива ... }
Другие доступные макросы: convar_addap(Name) — регистрация массива указателей, convar_addpp(Name) — регистрация указателя на указатель.
В приведённом выше примере регистрируются три типа переменных: целочисленная, указатель и массив. После регистрации с помощью соответствующих макросов convar_addX(), эти переменные становятся доступными через shell с помощью команд var NAME и show memory ADDRESS.
Если команда var вызывается без аргументов, выводится список всех зарегистрированных переменных:
esp32#>var % Sketch variables: % Variable X name | sizeof(X) | typeof(X) | Value %-----------------+-----------+------------------+---------------- % table | 4 | int * | 0x3ffbdb88 % a4 | 4 | float * | 0x3ffbdbb4 % a3 | 4 | float | 10.000000 % a2 | 4 | unsigned int | 0 % a1 | 1 | unsigned char | 99 % a0 | 4 | int | -99 % tbl_min_len | 2 | unsigned short | 16 % bypass_qm | 4 | int | 0 % pcnt_unit | 4 | int | 0 % pcnt_channel | 4 | int | 0 %ls_show_dir_size | 4 | int | 1 esp32#>
Обрати внимание: для указателей и массивов отображается адрес, а не содержимое памяти. Чтобы разыменовать указатель или отобразить содержимое массива, используй var VAR_NAME:
esp32#>var a4 % float * a4 = 0x3ffbdbb4; // Pointer to a 4-byte memory region % a4[1] = { % 10.000000, // a4[0] % };
Другой пример:
esp32#>var table % int * table = 0x3ffbdb88; // Array of 10 elements (4 bytes each) % int table[10] = { % 1, // table[0] % 2, // table[1] % 3, // table[2] % 4, // table[3] % 5, // table[4] % 6, // table[5] % 7, // table[6] % 8, // table[7] % 9, // table[8] % 0, // table[9] % };
Чтобы обратиться к конкретному элементу массива, укажи индекс, как в языке C:
esp32#>var table[5] % int table[5] = 6; esp32#>
Такой синтаксис можно использовать и для указателей. Использование индекса к переменной-указателю означает смещение указателя перед разыменованием. В таком случае ESPShell выводит предупреждение, так как не может определить допустимые границы памяти.
Ещё один пример:
esp32#>var a1 % unsigned char a1 = 99; esp32#>
Чтобы изменить значение переменной, используй команду var VARIABLE_NAME NEW_VALUE.
Пример: изменим значение переменной a1
на 88:
esp32#>var a1 88 esp32#>var a1 % unsigned char a1 = 88; // use "var 88" see this number in hex, oct, bin etc esp32#>
Выполняется базовая проверка типов: нельзя присвоить знаковое значение беззнаковой переменной, или значение с плавающей точкой — целочисленной. Также невозможно изменить адрес массива, так как он фиксируется компоновщиком и не может быть изменён во время выполнения. Впрочем, если выполнить команду по установке значения массива, новое значение установится. Но это лишь для ESPShell: для скетча адрес массива остается неизменным.
Команда var также может использоваться для преобразования чисел между системами счисления. Если аргумент команды — число (десятичное, шестнадцатеричное, вещественное, восьмеричное или бинарное), ESPShell отображает таблицу с представлением числа в разных системах счисления, а также выполняет небезопасное C-подобное преобразование памяти. Это полезно для просмотра внутреннего представления отрицательных или вещественных чисел.
Пример:
esp32#>var 666 % "666" is a number, which can be written as: % C-style cast of a memory content: % unsigned : 666 % signed : 666 % float : 0.000000 % Same number in different bases: % Hex : 0x29a % Octal : 01232 % Binary : 0b1010011010 esp32#>
Или:
esp32#>var 666.666 % "666.666" is a number, which can be written as: % C-style cast of a memory content: % unsigned : 1143384736 % signed : 1143384736 % float : 666.666016 % Same number in different bases: % Hex : 0x4426aaa0 % Octal : 010411525240 % Binary : 0b1000100001001101010101010100000 esp32#>
Или:
esp32#>var 0b111 % "0b111" is a number, which can be written as: % C-style cast of a memory content: % unsigned : 7 % signed : 7 % float : 0.000000 % Same number in different bases: % Hex : 0x7 % Octal : 07 % Binary : 0b111 esp32#>