USB-UART адаптер++ или почти grep/sed на вашем столе.

 spipe300 200 USB-UART адаптер для сбора логов  это один из самых распространенных приборов на столе у embedded разработчика. Потому что когда, в конце концов, ваш проект "отрывается" от JTAG проводов и начинает свободный "полет", этот "полет" необходимо контролировать, иначе  он рискует очень быстро закончиться. Вот тогда на помощь разработчику приходят логи, но логи обычно пишутся на все "случаи жизни" что порождает другую проблему - количество логов может "заземлить" ваш проект не хуже "встроенных" в проект багов.... Но хватит лирики!

Мне всегда хотелось иметь инструмент, позволяющий быстро, просто и не залезая в код фильтровать поток логов. И вот недавно я решил сделать такой девайс. Называеться он SmartPipe.

SmartPipe - это USB-UART адаптер, но с одной важной фичей, девайс может мониторить все строки, которые он получает по UART/USB и фильтровать/редактировать их с помощью набора простых правил. То есть например если интересны вызовы функции "get_more_info" в потоке лога, написав простое правило, можно "раскрасить" лог этой функции в красный цвет для заметности. Аналогичным образом для любой строки из лога в любой момент вы можете: добавить символы/пробелы, изменить фон/цвет, добавить дамп времени, наконец просто отменить вывод этой строки чтоб она не мешала читать лог. На сайте устройства (fibell.com.ua) описано как включить и что установить, чтобы SmartPipe заработал (подробнее см. на сайте Первое включение). Но вкратце все просто. Подключили SmartPipe к компьютеру через USB, компьютер опознает девайс как два виртуальных порта и MassStorage, установили, если надо, драйвера и все - девайс уже работает....но только как обычный USB-UART адаптер, где UART - это RXD/TXD/GND разъем на SmartPipe, USB - это первый виртуальный порт девайса VCOM1, номер которого в Windows можно узнать в Device Manager(Диспечер устройств) (ищем SmartPipe USB-COM1 Port в описании устройства).

dev man

И так мы получили обычный USB-UART адаптер, теперь настроим SmartPipe для обработки логов, и для примера возьмем вот такие логи.

  1. main.c line:12 Start device.
  2. main.c line:38 Init.
  3. msg.code:38
  4. dev.c line:118
  5. create dev 1
  6. msg.code:12
  7. msg.code:54
  8. msg.code:38
  9. dev.c line:118
  10. create dev 2

Чтобы паралельно с написанием статьи не создавать "на коленях" своего "терминатора серии 800, модель 101" для генерации лога, воспользуемся конфигурацией каналов SmartPipe - test. Конфигурация каналов - это описание того как данные "движуться"  между Serial портами устройства. SmartPipe имеет несколько Serial портов для работы: два виртуальных COM порта(VCOMx) для связи с компьютером и один UART порт (RXD/TXD/GND). Все эти порты можно конфигурировать между собой в каналы обмена данных. В девайсе уже сконфигурированы три канала по умолчанию : direct, test, filter. Канал test это соединение двух виртуальных портов VCOM1 <-> VCOM2, что очень удобно для тестирования - в одной консоли пишеш данные от "терминатора" в другой смотрим лог. Более подробную информацию о каналах и о всем остальном можно узнать на сайте.

И так настравиваем SmartPipe:

1. Начальные условия.

  • Мы включили девайс и настроили терминальную программу, например TeraTerm (см. на сайте Первое включение) для работы с VCOM1 (настройки самого порта baudrate/stiopbits и тд. которые вы выставляете при настройки терминальной программы применяются к UART порту SmartPipe и для нашего примера значения не имеют, кроме двух важных параметров для настройки TeraTerm это: Setup/Serial port.../Flow control = none; Setup/Terminal.../Transmit = CR+LF ).

2. Переходим в командный режим SmartPipe (COMMAND MODE) для настройки правил.

  • Для этого нажимаем комбинацию клавиш CTRL-Q/CTRL-S/ENTER.
  • Видим приглашение для ввода "sLog:

3. Удаляем  на всякий случай старый список.

  • Выполняем команду: eraseall

4. Добавляем правило для конфигурации каналов - test.

  • Выполняем команду: add :;;test;
  • O правилах подробнее можно узнать на сайте, скажу только что "магическая" последовательность ":;;" означает, что это правило будет выполнять только один раз при начале работы с правилами.

5. Добавляем правило для конфигурации сброса таймера в 0, так как я хочу добавить дамп времени в лог.

  • Выполняем команду: add :;;resettime;

6. Добавляем правило для добавления подстроки " =====> Signal: " для всех строк лога, которые имеют подстроку "mes.code:".

  • Выполняем команду: add :*msg.code:*;;format =====> Signal: @;

7. Добавляем правило для вывода дампа времени для всех строк лога, которые имеют подстроку ".c".

  • Выполняем команду: add :*.c*;;ltime;

8. Добавляем правило для "покраски" в красный цвет всех строк лога, которые имеют подстроку "line".

  • Выполняем команду: add :*line*;;lcolor red;

9. Посмотрим список правил, которые у нас получились.

  • Выполняем команду: list

После всех этих шагов мы должны получить список правил для работы устройства.

Теперь нам надо выйти из COMMAND MODE.

10. Вызываем команду: exit

11. Теперь настраиваем еще одну терминальную программу для работы с VCOM2 (аналогично настройки для VCOM1).

12. Берем наш лог для примера и копируем в VCOM2 терминал. Данные "пройдут" по каналу test  и будут обработаны в соответствии с нашими правилами. В VCOM1 терминале должен появиться примерно такой лог: (примерно, потому что многое зависит от терминала который вы используете, если он не понимает ESС-последовательности то "покрасить" лог не получиться)

Для настройки работы с реальным устройством через UART, шаги аналогичные, только необходимо выбрать конфигурацию filter в шаге 2. И помнить что для работы UART порта его надо правильно сконфигурирвать (baudrate/stiopbits и тд.). Это делается через настройки терминальной программы на VCOM1/VCOM2 портах, которые автоматически применяются к UART порту SmartPipe.