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#>