Вот основные вещи, которые вам нужно определить:
- Уровни трассировки (например, Отладка, Оповещения, Предупреждения, Информация, Критические и т. Д.). У вас также должен быть установлен текущий уровень трассировки, поэтому, если текущий уровень трассировки - INFO, то будут напечатаны все сообщения с уровнем трассировки выше информации. Если текущий уровень трассировки является критическим, то будут напечатаны только критические сообщения.
enum _TraceLevelType
{
INFO = 0,
DEBUG,
WARNING,
ERROR,
CRITICAL
} TraceLevelType;
- Коды ошибок, я думаю, что лучший способ - получить большое перечисление. Примерно так:
enum _ErrorType
{
//Internal errors 0-100
APPLICATION_FAILURE = 0,
...
MEMORY_FAULT,
//UI ERRORS 101-200
INVALID_OPTION_SELECTED = 101,
....
...
}ErrorType;
- Очередь сообщений. У вас должен быть механизм, с помощью которого каждый может отправлять сообщения, и эти сообщения должным образом помещаются в очередь. Поскольку вы работаете над встроенными системами, это очень важно. Вы не хотите тратить время на печать сообщений отладки в ОС реального времени. Таким образом, поток, управляющий кодами ошибок, должен иметь очень низкий приоритет, и все полученные сообщения должны публиковаться в очереди, поэтому, когда планировщик решит вызвать его, вы выполняете printfs на консоли или на любом другом выходном сигнале. *
Итак, ваш метод ошибки будет примерно таким:
TraceError(TraceLevelType traceLevel, ErrorType errorType, char *msg)
{
if(CURRENT_TRACE_LEVEL <= traceLevel)
/* Ignore message */
else
/*Queue the Message*/
}
Вы могли бы также иметь больше параметров, чтобы указать, какой модуль отправляет ошибку, но я думаю, что это в основном так.