Отладка вывода через printf на процессоре Cortex-M3, останавливается на инструкции BKPT + путаница с JTAG и портами sw - PullRequest
3 голосов
/ 12 июля 2010

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

Ответы [ 4 ]

6 голосов
/ 13 июля 2010

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

3 голосов
/ 13 июля 2010

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

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

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

2 голосов
/ 29 декабря 2010

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

2 голосов
/ 10 августа 2010

SW - это двухпроводной интерфейс, обеспечивающий доступ к портам отладки на устройстве.

У руки есть .pdf об этом здесь:

http://www.arm.com/files/pdf/Low_Pin-Count_Debug_Interfaces_for_Multi-device_Systems.pdf

...