Программирование ARM IAR EWB ARM: отладочная трассировка в проектах (trace_LOG, trace_LEVEL, trace.h) Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


IAR EWB ARM: отладочная трассировка в проектах (trace_LOG, trace_LEVEL, trace.h) Печать
Добавил(а) microsin   

В проектах примеров IAR для вывода отладочных сообщений используется подпрограмма trace_LOG. Например, для ARM7 Atmel по умолчанию для вывода используется порт DBGU (физически это TTL-аналог RS232), который позволяет отображать выводимые данные в консоли отладки (см. [1]). Для целей отладки удобно применять макрос trace_LOG, и во всех примерах IAR/Atmel он активно используется. 

[Как использовать trace_LOG

Макрос trace_LOG для вывода используют стандартную подсистему вывода printf (который по умолчанию и выводит данные в DBGU). Для того, чтобы вывести какое-либо отладочное текстовое сообщение, нужно просто вызвать подпрограмму trace_LOG, где в качестве параметра будет указано выводимое сообщение:    

//Эта строка выведет в консоль
// "Hello, World!"
trace_LOG(trace_INFO, "Hello, World!\n\r");

Можно использовать форматированный вывод для printf, с любым количеством параметров, например: 

//Эта строка выведет
// "Цифра 1, цифра 2, буква A, буква B"
trace_LOG(trace_INFO,
          "Цифра %i, цифра %i, буква %c, буква %c\n\r",
          1, 2, 'A', 'B');

trace_LOG-output-example.PNG 

Как Вы возможно заметили, функция trace_LOG имеет также первый параметр, в качестве которого в наших примерах задано значение trace_INFO. О назначении этого параметра подробнее будет рассказано далее.   

[Как настроить вывод через trace_LOG

Чтобы начать использовать trace_LOG, нужно:

1. Подключить в модуль, где будет использоваться trace_LOG, файл заголовка trace.h (обычно он находится в папке at91lib\utility\).

2. Настроить нужный уровень обработки форматированного вывода printf библиотеки DLib. От этого зависит скорость обработки вызовов trace_LOG и объем подключаемого кода библиотек printf. Уровень обработки printf настраивается в свойствах проекта General Options -> Library Configuration -> выпадающий список Library: и General Options -> Library Options -> выпадающий список Printf formatter. Обычно я использую Library Full и Printf formatter Small.

3. Перед первым вызовом trace_LOG нужно настроить порт DBGU. Обычно это делается в секции настройки аппаратуры, до входа в бесконечный цикл main (второй параметр задает стандартную скорость в бодах):

trace_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);

Теперь в теле программы можно использовать вывод отладочных сообщений, вставляя где надо trace_LOG. Следует отметить, что вывод trace_LOG очень быстрый, и поэтому его можно использовать почти в любом месте (даже в обработчиках прерывания) - но без фанатизма, конечно.

[Управление трассировкой - trace_LEVEL, уровни вывода отладки trace_LOG, макроопределение NOTRACE]

Макрос trace_LOG написан таким образом, что можно управлять отладочным выводом на этапе компиляции. Для этого служит первый параметр макроса, и макроопределение trace_LEVEL. Первый параметр может принимать значения, перечисленные в таблице (все эти значения определены в trace.h).

Уровень отладочного сообщения Эквивалентное
цифровое
значение
Описание работы уровня вывода отладочного сообщения
trace_DEBUG 0 Используется только в целях отладки. Не для вывода какой-либо значимой информации, не относящейся к отладке.
trace_INFO 1 Используется для трассировки выполнения программы, используется чаще всего. Должна разрешить пользователю видеть сообщения программы.
trace_WARNING 2 Используется для отображения малозначимых ошибок (minor error). На такие сообщения часто можно не обращать внимания, т. к. они могут случаться.
trace_ERROR 3 Используется для отображения ошибок, которые не требуют остановки выполнения программы, однако показывают серьезную проблему в коде.
trace_FATAL 4 Используется для отображения фатальной, значимой ошибки (major error), которая делает невозможным дальнейшее выполнение программы.

Макроопределение trace_LEVEL может быть назначено (через свойства проекта C/C++ Compiler -> Preprocessor -> Defined symbols или через оператор #define) в любое значение от 0 до 4, либо не назначено вовсе. Если trace_LEVEL не назначено, то автоматически устанавливается trace_LEVEL 0.

Логика управления отладочным выводом следующая. Если текущий установленный уровень trace_LEVEL меньше или равен уровню, указанному в первом параметре trace_LOG (в нашем примере используется trace_INFO), то сообщение trace_LOG выведется. Например, если trace_LEVEL не задан (т. е. он равен 0), то будут выводиться сообщения любых вызовов trace_LOG, какой бы первый его параметр мы не указали. Если же указать trace_LEVEL=1, то будут выводиться trace_LOG со всеми параметрами, кроме trace_DEBUG (т. е. вывод сообщений для отладки будет отключен). Если указать trace_LEVEL=3, то будут выводиться только trace_LOG, запущенные с параметрами trace_ERROR и trace_FATAL, весь остальной отладочный вывод будет подавлен. Таким образом, чем выше указанный уровень trace_LEVEL, тем меньше отладочной информации будет выводиться, а если trace_LEVEL минимальный (равен 0 или не указан), то будет включен весь отладочный вывод от trace_DEBUG до trace_FATAL.

Полностью отключить трассировку (для отдельного модуля или для всего проекта целиком) можно, если задать макроопределение NOTRACE (стандартным образом - либо директивой define, либо в свойствах проекта). 

[Ссылки]

1. Преобразователь JTAG 20 pin -> (JTAG 10 pin + DBGU + SAM-BA). Консоль отладки DBGU, подключаемая по USB.
2. IAR EWB ARM: форматированный вывод printf библиотеки DLIB.

 

Добавить комментарий


Защитный код
Обновить

Top of Page