**nr_micro_shell**

[Китайская версия](./readme.md)

> v1.0.2

## 1 Введение

При отладке и обслуживании часто необходимо взаимодействовать с микроконтроллером (MCU), чтобы получать, устанавливать параметры или выполнять некоторые операции. **nr_micro_shell** — это базовый инструмент командной строки, написанный для MCU с ограниченными ресурсами, чтобы удовлетворить этот спрос. Хотя в компоненте RT_Thread предоставляется мощный инструмент взаимодействия с командной строкой **finsh**, для MCU с меньшим объёмом ROM и RAM ресурсов **finsh** всё ещё слишком велик. Если вы хотите использовать инструмент командной строки на этих платформах, **nr_micro_shell** может быть хорошим выбором.

**nr_micro_shell** имеет следующие преимущества:

1. Меньшие ресурсы, простота использования, гибкость и удобство. В процессе использования задействованы только две функции: ***shell_init()*** и ***shell()***. Этот инструмент удобно использовать без дополнительной работы по кодированию на MCU с RTOS или голом MCU.

2. Хороший опыт взаимодействия. Он точно похож на командную строку Linux. Когда терминал последовательного порта поддерживает ANSI (например, терминал hypertrm), он не только поддерживает базовое взаимодействие с командной строкой, но также предоставляет функцию завершения команды табуляции, запроса истории команд и изменения курсора с помощью клавиш направления.

3. Хорошая расширяемость. **nr_micro_shell** предоставляет пользователям стандартные прототипы функций пользовательских команд. Когда вы хотите определить свою собственную команду, просто напишите функции команд и зарегистрируйте их.

Сравнение ресурсов, занимаемых **nr_micro_shell** и **finsh** (finsh не использует MSH) при одинаковой конфигурации:

|    | Исходный проект | Увеличение после добавления nr_micro_shell | Увеличение после добавления finsh
|--- | ----- | ------------------- | ----------
|ROM | 63660 | +3832               | +26908
|RAM | 4696  | +1104               | +1304

Конфигурация:

- До 3 исторических команд.
- Поддержка завершения табуляции.
- Максимальная длина командной строки — 100.
- До 10 параметров команды.
- Стек потока командной строки составляет 512 байт.

Демонстрация **nr_micro_shell**:

![RT](./docs/pic/rt_test.gif)
![bare](./docs/pic/test.gif)

### 1.1 Структура файла

Название       | Описание
-------- | --------------------------------------------------------------------------------------------
docs     | Каталог документов, включая GIF-изображения для демонстрации и т. д.
examples | Каталог примеров, включая примеры функций команд: ***nr_micro_shell_commands.c*** и примеры использования под rt_thread ***nr_micro_shell_thread.c***.
inc      | Каталог заголовков.
src      | Каталог исходного кода.

### 1.2 Лицензия

Пакет **nr_micro_shell** следует лицензии MIT. Пожалуйста, обратитесь к файлу «license» для получения подробной информации.

### 1.3 Зависимости

Нет

## 2 Использование пакета **nr_micro_shell** под RT_Thread с ENV

Вам нужно выбрать пакет **nr_micro_shell** из менеджера пакетов RT_Thread. Конкретный путь выглядит следующим образом:

```
Онлайн-пакеты RT-Thread
    Пакеты инструментов ---> 
        [*] nr_micro_shell: Лёгкий инструмент взаимодействия с командной строкой. --->
```

После нажатия клавиши «пробел», чтобы выбрать соответствующие настройки, нажмите «Enter», чтобы настроить соответствующие параметры. Затем позвольте менеджеру пакетов rt_thread автоматически обновиться или используйте команду «Pkgs --update», чтобы обновить пакет до BSP.

Если вам нужно запустить образцы, убедитесь, что в конфигурации rt_thread включена опция «использование консоли для kt_printf», kt_printf может работать нормально, а опция «использовать компоненты автоматически инициализации» включена. **nr_micro_shell** можно использовать для прямой загрузки или моделирования. Когда командная строка пуста, нажмите клавишу табуляции, чтобы отобразить все поддерживаемые команды. Для примера тестовой команды см. использование GIF-файлов в doc/pic. Процесс создания пользовательской команды см. в методе, описанном ниже в разделе **3 Использование пакета nr_micro_shell без RTOS**.

## 3 Использование пакета **nr_micro_shell** без RTOS

### 3.1 Конфигурация:

Всю работу по настройке можно выполнить в ***nr_micro_shell_config.h***. Подробности см. в комментариях к файлу.

### 3.2 Использование:

- Убедитесь, что все файлы добавлены в ваш проект.

- Сделайте Конечно, вот перевод текста на русский язык:

Конечно, функция макроса «shell_printf()», «ansi_show_char()» может быть использована в вашем проекте.

Пример приведён ниже:
```c
#include "nr_micro_shell.h"

int main(void)
{
    /* Инициализация */
    shell_init();

    while (1)
    {
        if (USART GET A CHAR 'c')
        {
            /* nr_micro_shell получает символы. */
            shell(c);
        }
    }
}
```

Перед использованием аппаратного ввода напрямую рекомендуется использовать следующий код (убедитесь, что информация может быть напечатана нормально), чтобы проверить, работает ли nr_micro_shell:
```c
#include "nr_micro_shell.h"

int main(void)
{
    unsigned int i = 0;
    /* NR_SHELL_END_OF_LINE 0 */
    char test_line[] = "test 1 2 3\n"
    /* Инициализация */
    shell_init();

    /* тест */
    for (i = 0; i < sizeof(test_line)-1; i++)
    {
        shell(test_line[i]);
    }

    while (1)
    {
        if (USART GET A CHAR 'c')
        {
            /* nr_micro_shell принимает символы */
            shell(c);
        }
    }
}
```
### 3.3 Добавьте свою собственную команду

**ШАГ 1**:

Вы должны реализовать функцию команды в ***nr_micro_shell_commands.c***. Прототип функции команды выглядит следующим образом:

```c
void your_command_funtion(char argc, char *argv)
{
    .....
}
```

**argc** — это количество параметров. **argv** хранит начальный адрес и содержимое каждого параметра. Если ваша входная строка:

```c
test -a 1
```

то **argc** будет равно 3, а содержимое **argv** будет:

```c
-------------------------------------------------------------
0x03|0x08|0x0b|'t'|'e'|'s'|'t'|'\0'|'-'|'a'|'\0'|'1'|'\0'|
-------------------------------------------------------------
```

Если вы хотите узнать содержимое первого или второго параметра, вы должны использовать:

```c
/* "-a" */
printf(argv[argv[1]])
/* "1" */
printf(argv[argv[2]])
```

**ШАГУ 2**:

Вам необходимо зарегистрировать команды перед их использованием. Есть два способа регистрации команд.

1. Когда NR_SHELL_USING_EXPORT_CMD не определён в файле конфигурации, зарегистрируйте вашу команду в таблице **static_cmd[]**, как показано ниже:

```c
const static_cmd_st static_cmd[] =
{
   .....
   {"your_command_name",your_command_funtion},
   .....
   {"\0",NULL}
};
```

***Внимание: НЕ УДАЛЯЙТЕ {"\0", NULL}!***

2. Когда NR_SHELL_USING_EXPORT_CMD определён в файле конфигурации и NR_SHELL_CMD_EXPORT() поддерживает используемый компилятор, вы можете зарегистрировать команду следующим образом:

```c
NR_SHELL_CMD_EXPORT(your_command_name,your_command_funtion);
```

## 4、Использование симулятора nr_micro_shell под Linux
В каталоге проекта `./examples/simulator/` хранится код имитации nr_micro_shell, продолжайте добавлять пользовательские команды в файл `./examples/nr_micro_shell_commands.c`, как описано выше. После добавления вы можете использовать команду make для компиляции исходного кода, созданный исполняемый файл — `./examples/simulator/out/nr_micro_shell` или `./examples/simulator/out/nr_micro_shell_db`. Доступные команды make следующие:

Код симулятора nr_micro_shell хранится в каталоге `./examples/simulator/`, вы можете добавить свою команду в `./examples/nr_micro_shell_commands.c` как описано выше. После добавления можно использовать команду `make` для компиляции исходного кода. Созданный исполняемый файл: `./examples/simulator/out/nr_micro_shell` или `./examples/simulator/out/nr_micro_shell_db`。 Доступные команды `make`:
```sh
# компиляция исполняемого файла
make
# компиляция файла gdb
make debug
# очистка файлов
make clean
```

## 5 Внимание

Используйте NR_SHELL_USING_EXPORT_CMD для выбора метода регистрации команд в соответствии с вашими привычками использования.

При использовании static_cmd[], убедитесь, что в вашем проекте существует реестр:

```c
const static_cmd_st static_cmd[] =
{
   .....
   {"\0",NULL}
};
```

При использовании NR_SHELL_CMD_EXPORT(), убедитесь, что NR_SHELL_CMD_EXPORT() поддерживает используемый компилятор, иначе будет сообщено об ошибке.

Клавиша ESC не поддерживается.

## 6 Контакты

- Сопровождающий: Nrusher
- Домашняя страница: <https://github.com/Nrusher/nr_micro_shell> или <https://gitee.com/nrush/nr_micro_shell>