Easyelectronics.ru

Электроника для всех
Текущее время: 19 сен 2019, 07:28

Часовой пояс: 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
Сообщения: 1539
Откуда: Курск
А почему не 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
Сообщения: 1539
Откуда: Курск
Там сам принцип. Не обязательно журналировать по сети. Можно, например, писать в файл на карту памяти.
Появится сеть - можно на удалённый сервер журналировать. Не придется переделывать.
Интегрировать куда-то в будущем проще.
IMHO


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

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

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

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

_________________
elisey.su


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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
В основном сижу на 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
Сообщения: 1191
Откуда: Сочи
Ага, а рейд карточек еще на отдельном микроконтроллере


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 Кб | Просмотров: 3436 ]

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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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