У меня есть блок USB-эмулятора Keil ULINK2, подключенный к разъему JTAG на моей плате, который отлично работает с встроенным процессором Cortex-M3 (серия TI / Stellaris / LuminaryMicro LM3S).Кажется, что порты JTAG и SWJ-DP имеют одинаковые контакты (и, следовательно, разъем на вашей плате) на этих процессорах.Один, кажется, не имеет возможности ITM (printf), другой имеет.
Предыдущие специалисты по прошивке всегда использовали stdio для UART (последовательный порт), но мне нужно освободить последовательный порт, чтобы отладочные сообщения не мешали другим данным, передаваемым / получаемым в / из последовательного порта,поэтому мне нужно, чтобы сообщения трассировки отправлялись в другое место.К сожалению, у меня только один последовательный порт на этой плате.Я думал, что функция ITM (Trace) в этом процессоре означает, что я могу отправлять отладочные сообщения printf прямо в мой отладчик / IDE (Keil uVision).В документации по процессору TI / Stellaris эта функция называется «Порт отладки JTAG последовательного соединения (SWJ-DP)», поддержка которой, как я читал, безусловно, является функцией, реализованной в Keil uVision IDE.
Добавление 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 уже не должны быть настроены для этого?Есть ли какая-то хитрость в том, чтобы заставить debug printf работать с портами Keil JTAG / sw?
Я не уверен, в чем разница между портом sw и JTAG.sw означает, что именно, я полагаю, это относится к одному из двух возможных режимов для физического разъема JTAG на плате, где JTAG - классический, но более ограниченный режим без поддержки трассировки, а режим sw добавляет поддержку трассировки без добавления каких-либо выводов в JTAG.расположение разъемов?Но это встроенные системы, где загадочность является нормой.Я новичок в разработке Cortex-M3, и многие из этих вещей являются новыми для меня со старых дней ARM7TDMI.Но Keil uVision выводит это сообщение: «ITM работает только с портом SW, а не с JTAG».SW - это другой физический порт, который вы должны спроектировать на своей плате?(Я использую специально разработанную доску приложений, а не стартовую плату для разработчиков.)
[Поиск в Google позволяет мне понять, что _sys_open
и некоторая прагма __use_no_semihosting_swi
и что-то еще тесно связаны с этимголоволомка, инструкции BRKPT в ПЗУ могут быть некоторым вариантом ARM для инструкции ARM SWI («программное прерывание»).]