Чтобы переменная стала доступной в ESPShell, её необходимо зарегистрировать.
ESPShell предоставляет API для регистрации и управления переменными скетча. Конечно же шелл не знает ничего о переменных вашего скетча до тех пор, пока вы явно не укажете шеллу, что такие-то и такие-то переменные должны быть доступны через шелл. Так же существует возможность создавать произвольные переменные, вводя комманды шелла: например, можно создать переменную MyVar, типа unsigned short int, которая привязана к адресу x3fcef000 - все это делается одно командой (см. ниже). Поддерживаются только простые типы C, такие как unsigned/signed int, char, short, float, а также указатели типа void*. Также поддерживаются массивы этих простых типов.
Для регистрации используется макрос 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) — регистрация указателя на указатель.
Представьте, что вам необходимо просматривать содержимое памяти по адресу 0x3fcef100 не как шестнадцатеричный дамп, а, например, как массив из 10 элементов типа float. Для этого нужно сообщить шеллу, что по указанному адресу находится переменная определённого типа:
esp32#>var 0x3fcef100 zzz float [10]
После выполнения этой команды по адресу 0x3fcef100 будет создана переменная zzz. Теперь её можно просматривать и изменять. Чтение и запись будут автоматически выполняться через память по указанному адресу с учётом размера типа данных и порядка байтов (byte order).
В приведённом выше примере регистрируются три типа переменных: целочисленная, указатель и массив. После регистрации с помощью соответствующих макросов 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#>