Easyelectronics.ru

Электроника для всех
Текущее время: 19 фев 2020, 12:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 21 авг 2014, 11:34 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Использую разнородные, разномастные, меняющиеся от проекта к проекту. Но причесывая библиотеки упёрся в необходимость сделать единую систему журналирования и логгирования ошибок.

Под ошибками я понимаю:
* битый пакет в сети
* неудача записи байта в еепром
* ошибка контрольной суммы где-то
* самотестирование провалено

То есть ошибки могут быть:
* незначительные, после которых можно продолжить выполнение
* ошибки после которых возможно самовосстановление
* критические ошибки

Проблема упирается в канал вывода и место хранения хранения информации.
Можно держать логи во внешней еепром, но не в каждом проекте есть еепром. Да и куда класть ошибки записи в еепром. Можно кидать в UART, но их нужно где-то хранить, а не просто выводить.

Сейчас подумываю о внутренней флеш памяти для хранения и UART (spi, can, i2c), как интерфейс ввода вывода.
Командно-терминальный интерфейс для доступа к записям журнала. Придумать метод гибкой настройки под каждый проект, группировка записей по категориям и думаю взлетит.

А как делаете вы?

ps. аппаратно сижу на stm32

_________________
elisey.su


Последний раз редактировалось elisey 21 авг 2014, 11:55, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования и логирования ошибок и отказов
СообщениеДобавлено: 21 авг 2014, 11:49 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1585
Откуда: Курск
А почему не syslog?
Всё уже продумано, придумано, стандартизировано и тд

Просто интересуюсь, на будущее


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования и логирования ошибок и отказов
СообщениеДобавлено: 21 авг 2014, 11:54 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Cthulhu писал(а):
А почему не syslog?
Всё уже продумано, придумано, стандартизировано и тд

Просто интересуюсь, на будущее

А он точно под встраиваемые системы и микроконтроллеры? Просто там написано про IP, шифрование, юникод и прочие взрослые штуки.

ps. Обновил название темы.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 21 авг 2014, 12:11 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1585
Откуда: Курск
Там сам принцип. Не обязательно журналировать по сети. Можно, например, писать в файл на карту памяти.
Появится сеть - можно на удалённый сервер журналировать. Не придется переделывать.
Интегрировать куда-то в будущем проще.
IMHO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 23 авг 2014, 14:32 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Cthulhu писал(а):
Там сам принцип. Не обязательно журналировать по сети. Можно, например, писать в файл на карту памяти.
Появится сеть - можно на удалённый сервер журналировать. Не придется переделывать.
Интегрировать куда-то в будущем проще.
IMHO

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

Начал писать систему, посмотрю что получится.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 26 авг 2014, 15:31 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 855
В основном сижу на AVR.

У меня в местах появления возможных критичных ошибок висят функции вида sysErr(int codeerr::n, this). Функция вешает систему и начинает быстро быстро мигать светодиодом, сигнализируя о критичной ошибке, одновременно спамя в uart номер ошибки и адрес объекта, в котором эта ошибка возникла (с++).

Вывод по некритичным ошибкам вешаю как команду в консоли устройства (тупо счетчик ошибок) (консоль и список выводимых переменных ставлю практически всегда....... Из за чего, правда, с трудом влезаю даже на atmega16).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 01 сен 2014, 23:41 
Заглядывает иногда

Зарегистрирован: 01 мар 2013, 04:08
Сообщения: 50
Параноидальное решение таково: Отладку высылать по отладочному RS-232. А на нем сидит отдельный микроконтроллер и пишет в SD-катрочку. Есть команды, которые позволяют послать лог обратно в хост (для удаленного считывания). В совсем параноидальном случае- логгирующий контроллер развязан гальванически, имеет свою батарею, питается от изолированного DC-DC преобразователя и пишет в зеркалируемые две SD карточки. RAID для карточек- пока в планах. Также логгер контролирует тепературу, уровни питания и потребления хоста, имеет собственные часы итд может служит ватчдогом (дернуть резет) хоста и даже отключить ему питание (холодная перезагрузка).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 02 сен 2014, 00:13 
Заглядывает иногда

Зарегистрирован: 08 янв 2014, 21:05
Сообщения: 130
Ага. Примерно такие же мысли и есть)
Только еще rtc добавить, чтобы лучше понимать время наступления событий и промежутки между ними.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 02 сен 2014, 12:22 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1219
Откуда: Сочи
Ага, а рейд карточек еще на отдельном микроконтроллере


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Методы журналирования ошибок и отказов под МК
СообщениеДобавлено: 03 сен 2014, 12:56 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Спасибо за ответы

По поводу отдельного логирующего контроллера думал об этом, но в некоторых проектах оверкил и неудобно. Да и если это просто логирующее устройство с карточкой, нужно еще понять, как использовать это преимущество. Оно дает возможность отловить и записать момент наступления фаталити, в остальных случаях оно не будет отличаться от внутреннего журналирования. Да вот только момент фаталити тоже как-то вычисить и прожурналировать нужно. Когда контроллер умирает, это для него неожиданность, и он ничего не сможет отправить в лог. Поэтому это устройство должно быть с аналоговыми входами, контролирующими питание таргета, какие-то его контрольные точки и прочее. Но тогда система логирования перерастает в систему контроля, усложняется и перестает быть темой данного топика, хотя тоже весьма интересна.

К какой концепции я пришел и куда двигаюсь:
Система разбита на два уровня:
- Модуль хранения журналов
- Интерфейс доступа к записям через терминал, записи событий в журнал

Модуль хранения журналов
Модуль хранения журналов может быть заменяемым: журналы могут храниться во внутренней flash мк, на внешней fram, на sd карте и т.д. Пока реализовал внутреннюю flash stm32 и внешнюю fram память с интерфейсом i2c.

Запись событий в журнал
Одна запись имеет размер 6 байт:
Код:
typedef struct {
    uint32_t timeStamp;
    uint8_t group;
    uint8_t msgType;
}

- Время события (unix time)
- Группа события (могут быть разные группы аварийных событий для удобства их анализирования и фильтрования: ошибки fram, ошибки modbus, внутренние ошибки и др). Группы событий пользователь создает и регистрирует сам.
- Индекс сообщения (0, 1, 2 и т. д). В контроллере есть массивы соответствия индекса сообщения и группы их строковому представлению. Программа работает с индексами, а для вывода в консоль используется строковое представление события.

Как примерно этим пользоваться.
Создаем и регистрируем группу событий:
делаем перечисления типов ошибок для одной группы:
Код:
typedef enum {
    fram_write_err,
    fram_read_err,
    fram_no_device_err
} fram_errors_t;


Потом делаем массив строковых представлений для ошибок
Код:
fram_errors_str[fram_write_err] = "Ошибка записи";
fram_errors_str[fram_read_err] = "Ошибка чтения";
fram_errors_str[fram_no_device_err] = "Девайс не найден";


И регистрируем это дело, указывая имя группы:
Код:
groupHandler = SystemLogger_RegisterGroup(fram_errors_str, "Fram");

Получили хендлер для работы с нашей группой. Хендлер это что-то типа указателя на объект нашей группы в модуле. Мы используем этот хендлер, когда нам нужно отправить событие, и нужно показать модулю, в какую группу мы добавляем событие.
Код:
SystemLogger_PutMessage(groupHandler, fram_read_err);


Что такое группа: класс ошибок и сообщений, относящихся к одной абстракции. Все события ошибок при работе с EEPROM можно отнести к одной группе. События ошибок modbus к другой группе. Так мы делим все ошибки на группы, чтобы не смешивать их в одном перечислении (fram_errors_t), каждый модуль получает возможность логировать свои ошибки, не зная и не думая, что другие модули делают тоже самое.

Интерфейс доступа к записям через терминал
А теперь как журнал читать. Сейчас читать его можно через comport в любом терминале, например putty. С помощью библиотеки microrl (описание на хабре), чуть-чуть мною модифицированной. Библиотека microrl такова, что ее можно перенести на любой другой интерфейс связи: ethetnet, modbus, can, беспроводной велосипед.
Выглядит это как обычный консольный интерфейс (юникс лайк):
Код:
logger -i 0 -n 20

вывести 20 последних событий начиная с индекса 0
Код:
logger -g Fram

Вывести все события из группы Fram

Доступные комманды
Код:
-i - индекс, начиная с которого выводить сообщения, где 0 - самое последнее событие
-n - количество событий, которое можно вывести
-g - имя группы, которую нужно вывести
-m - тип сообщения, которое нужно вывести
-info - информация о журнале: количество событий в журнале, виды групп и типы сообщений.

todo добавить фильтрованный вывод по времени событий.

Все вышеперечисленные команды создают "фильтры", которые объединяются логическим "И". Тоеcть:
- Команда logger -n 2 -g Fram Будет выводить события группы Fram, пока не выведет 2 события.
- Команда logger -m 3 -g Fram -n 4 -i 1 Выведет события, которые имеют индекс не меньше 3 И всего выведется событий 4 И события будут из группы Fram и тип события 1 (в нашем случае это Ошибка чтения). Естественно что указание типа события не может быть без указания группы. Это ограничение.

Прошу прощения за сумбурность, ибо не имею сейчас цели в написании статьи, просто быстро рассказал, как это будет выглядеть. Если интересно, то, когда закончу, могу написать об этом подробнее. Сейчас дорабатываю модуль доступа к данным через консоль, чтобы это было максимально переносимо и читаемо. Ну и переделываю модуль регистрации групп событий, чтобы максимально отвязать клиентский код от реализации логера. Код можно посмотреть на гитхабе. Ветка master редко обновляется, обычно все самое новое в dev.


Вложения:
logger.png
logger.png [ 21.84 Кб | Просмотров: 3510 ]

_________________
elisey.su
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: sdv_cyborg


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB