2010-07-11 7 views
3

У меня есть эмулятор 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 («программное обеспечение-прерывание»).

ответ

6

С моей стороны было ошибкой понять, что stdio не реализована, но вы должны предоставить свою собственную реализацию, обычно выполняемую внутри файла под названием «retarget.c». Имя файла является чисто условным, но хорошо документировано (как выясняется) внутри документации Keil's uVision/RTLIB.

3

Я сделал это с помощью инструментальной привязки IAR EWW ARM, но термин semihosting приводит меня к мысли, что подход Keil аналогичен. Должна быть опция при указании стандартной библиотеки для ссылки на использование функции semihosting. Это будет компилировать/связывать в другой библиотеке, которая перенаправляет printf/putc через порт JTAG в отладчик.

Так что посмотрите варианты проекта в IDE Uvision или в сценариях make. В командной строке IAR linker это «-semihosting», но, вероятно, отличается для инструментов Keil.

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

+0

Да. Это то, что означает полуохость! Printf-перенаправлены-через-JTAG. –

2

Для решения этой проблемы в Keil uVision просто пойти проецировать варианты. На вкладке «Цель»/«Генерация кода» установите флажок «Использовать MicroLIB».

+0

Вы должны знать, что использование MicroLib также повлияет на более тонкие вещи, такие как реализация операций с плавающей запятой (если ваше ядро ​​не имеет FPU) будет несовместимым с IEEE-754. Дополнительную информацию смотрите здесь http://www.keil.com/support/man/docs/armlib/armlib_chr1358938938946.htm – Amomum