ESPShell для Arduino :: Доступ к переменным скетча

[ На русском ] ↔ [ English ]

ПЕРЕМЕННЫЕ СКЕТЧА: РЕГИСТРАЦИЯ

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