У меня есть эмулятор Kyil ULINK2 USB, подключенный к разъему JTAG на моей плате, который отлично работает с Cortex- M3 на борту (серия TI/Stellaris/LuminaryMicro LM3S). Кажется, что и JTAG, и порт SWJ-DP имеют одинаковые контакты (и, следовательно, разъем на плате) на этих процессорах. Кажется, что у него нет возможности ITM (printf), а другой - нет.Отладка вывода через printf на процессоре Cortex-M3, киосках в инструкции BKPT + путаница о JTAG и sw портах
Предыдущие пользователи прошивки всегда использовали stdio для UART (последовательный порт), но мне нужен последовательный порт, освобожденный таким образом, чтобы отладочные сообщения не мешали другим данным, отправляемым/принимаемым в/из последовательного порта, таким образом, я необходимо, чтобы сообщения о трассировке отправлялись в другое место. К сожалению, у меня только один последовательный порт на этой плате. Я думал, что функция ITM (Trace) в этом CPU означала, что я могу отправлять отладочные сообщения printf непосредственно в мой отладчик/IDE (Keil uVision). Документация CPU TI/Stellaris вызывает эту функцию «Серийный порт JTAG Debug Port (SWJ-DP)», поддержка которого, я прочитал, определенно является функцией, реализованной в IDE Keil uVision.
Добавление сообщения printf в мой код заставляет мой код блокироваться при запуске отладки. Карцер, кажется, здесь в библиотеках RTL, которые связаны в моем приложении, в функции _sys_open, в инструкции BKPT:
_sys_open:
0x00009D7A B50E PUSH {r1-r3,lr}
0x00009D7C E9CD0100 STRD r0,r1,[sp,#0]
0x00009D80 F7FFFC0F BL.W strlen (0x000095A2)
0x00009D84 9002 STR r0,[sp,#0x08]
0x00009D86 4669 MOV r1,sp
0x00009D88 2001 MOVS r0,#0x01
>>0x00009D8A BEAB BKPT 0xAB
0x00009D8C BD0E POP {r1-r3,pc}
выше, кажется, часть кода, созванном __rt_lib_init_stdio_1
.
Что происходит? Я не знаю, что делает BKPT. Я предполагаю, что он поднимает контрольную точку программного обеспечения, которая затем должна обрабатываться отладчиком? Должно ли не быть настроено для этого программное обеспечение и оборудование Keil/ARM ULINK2? Есть ли какой-то трюк для работы отладки printf с портами Keil JTAG/sw?
Я не уверен, какая разница между портом sw и JTAG. sw означает, что именно, я считаю, что это относится к одному из двух возможных режимов для физического соединителя JTAG на плате, где JTAG является классическим, но более ограниченным режимом без поддержки трассировки, а sw-режим добавляет поддержку трассировки без добавления каких-либо контактов в JTAG расположение разъемов? Но это встроенные системы, где загадочная является нормой. Я новичок в разработке Cortex-M3, и многие из этих вещей новы для меня со времен старого ARM7TDMI. Но Keil uVision выводит это сообщение: «ITM работает только с портом SW, а не с JTAG». Является ли SW другим физическим портом, который вы должны проектировать на своем борту? (Я использую пользовательский разработан плату приложений, а не развитие стартера доску.)
[погуглить вокруг позволяет мне на то, что _sys_open
и некоторая прагма __use_no_semihosting_swi
и еще что-то глубоко вовлечены в этой головоломке, BRKPT инструкция в ПЗУ может быть какой-то вариант ARM в инструкции ARM («программное обеспечение-прерывание»).
Да. Это то, что означает полуохость! Printf-перенаправлены-через-JTAG. –