STM32 IAR не выводит трассировку ITM, если printf не включен в код

У меня есть небольшой проект, в который я добавил свои собственные пользовательские функции отладки, чтобы иметь дополнительную функциональность. Они отлично работают и используют следующий метод для отправки данных:

while(*bp)
  ITM_SendChar(*bp++);

Наконец-то я переключил все операторы printf на использование моей собственной функции, и весь вывод просто прекратился. Немного поигравшись, я понял, что пока у меня скомпилирована одна единственная функция printf, независимо от того, где, ITM_SendChar работает сразу же.

Казалось бы, есть некоторая скомпилированная функциональность, когда в проекте используется printf, что позволяет работать ITM_SendChar.

Это не имеет большого значения, но мне довольно любопытно, почему это так. Возможно, есть другой способ инициализировать систему ITM (Instrumentation Trace Macrocell) без необходимости вставлять фиктивный printf?


person RobC    schedule 02.11.2014    source источник
comment
После создания проекта у вас должен быть создан файл карты. Вы можете построить проект без printf, переименовать файл карты, перестроить его снова с фиктивным printf где-нибудь и сравнить текущий файл карты с предыдущим файлом карты. В частности, найдите символы ITM_SendChar и printf и посмотрите, есть ли различия в этих областях. Ваша теория некоторых функций, скомпилированных при использовании printf, звучит странно, но если есть дополнительная функциональность, вы должны увидеть ее как часть различий между двумя файлами.   -  person barak manos    schedule 04.11.2014
comment
Я также заметил, что есть некоторые тонкие детали, определяющие, видите ли вы вывод ITM или нет. Я рекомендую ознакомиться с прекрасным руководством по ITM в блоге atollic, в котором также указаны внешние настройки ITM в адаптере трассировки и тому подобное.   -  person HelpingHand    schedule 01.06.2020


Ответы (1)


Я столкнулся с той же проблемой, и я попробовал все с правильной настройкой регистров ITM. Но я не мог понять.

Мое решение не использовать интенсивное использование памяти printf - использовать putchar:

while(*bp)
  putchar(*bp++);

Это даже работает, когда у меня есть только один putchar где-то в коде, который выводит один символ, а затем выводит другие вещи с помощью ITM_SendChar()

Я предполагаю, что IAR автоматически добавляет некоторую функцию конфигурации, как только включена функция putchar.

person A. Bieri    schedule 14.02.2020