Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Альтернатива USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
NeDoEng
В настоящее время (впрочем как и многие начинающие) использую для вывода отладочных сообщений USART. Т.е. помимо программатора к плате подключен еще и преобразователь USB-USART - неудобно же.
Знаю, что есть такой интерфейс SWD, который поддерживает вывод отладочной информации через вывод SWO. Т.е. имея 1 программатор с интерфейсом SWD такой как ST-link/V2 можно и шить и получать отладочные сообщения.
Например при использовании USART на скорости 921600 бод 1 байт можно передать примерно за 11 мкс. Достаточно быстро и погрешность установки скорости 0,16%. Быстрее пробовал, но не пашет почему-то. Использую преобразователь на ft2232.

SWO может так же или быстрее? Нигде не найду конкретных значений.
rx3apf
Не представляю, почему бы 921600 мог бы не работать через FT2232 - у меня avreal32 на одном порте FT2232, а терминал на другом, и на этой скорости - прекрасно работает. Равно как работает и через FT232. Про SWD - не подскажу...
AlexandrY
Цитата(NeDoEng @ Jun 15 2016, 15:42) *
SWO может так же или быстрее? Нигде не найду конкретных значений.


На ST-Link больше пары сотен килобайт с SWO не выжмете.
Есть еще более быстрый отладочный вариант - https://habrahabr.ru/post/259205/
Но и он не даст более 500 Кбит/с

Если применить J-Link Ultra то пару мегабит сделать можно.
zltigo
QUOTE (NeDoEng @ Jun 15 2016, 15:42) *
Т.е. помимо программатора к плате подключен еще и преобразователь USB-USART - неудобно же.

Так выкиньте программатор нафиг и загружайте по тому-же отладочному UART. Всего делов загрузчик.
ar__systems
Цитата(zltigo @ Jun 15 2016, 10:08) *
Так выкиньте программатор нафиг и загружайте по тому-же отладочному UART. Всего делов загрузчик.

программатор в 10 раз быстрее грузит. Зачем делать то, что можно не делать? Загрузчик, софт для него.

Имхо ничего удобнее уарта для отладки нет. Большие скорости там не нужны, 115200 более чем достаточно.
Капец какое неудобство, надо два разъема подключать! А еще же и питание надо по третьему? Как можно так жить?
NeDoEng
Цитата(AlexandrY @ Jun 15 2016, 16:44) *
На ST-Link больше пары сотен килобайт с SWO не выжмете.

Если применить J-Link Ultra то пару мегабит сделать можно.

Воот, я об этом и спрашивал. Спасибо за пояснение.
Цитата(zltigo @ Jun 15 2016, 17:08) *
Так выкиньте программатор нафиг и загружайте по тому-же отладочному UART. Всего делов загрузчик.

Да, можно так, но в одно движение из Кейла вряд ли получится загрузить.
Цитата(ar__systems @ Jun 15 2016, 17:31) *
Имхо ничего удобнее уарта для отладки нет. Большие скорости там не нужны, 115200 более чем достаточно.
Капец какое неудобство, надо два разъема подключать! А еще же и питание надо по третьему? Как можно так жить?

Во-во и не говорите. Хотя питание от программатора беру rolleyes.gif
jcxz
Цитата(NeDoEng @ Jun 15 2016, 18:42) *
SWO может так же или быстрее? Нигде не найду конкретных значений.

Лучше так не делать (не убирать отладочный UART). Вылезет потом у Вас проблема, что с подключенным SWD работает, а без - нет, как искать будете?
Включения/выключения питания, технологическое тестирование в течение длительного времени (когда какая-то инфа пишется в лог) с десятком устройств - как это всё делать?
Испытания на устойчивость к помехам и на помехоэмиссию с контролем работоспосбности, тоже - как?
Да и как-то пробовал я выводить отладку через J-Link, имхо: при этом нарушается реалтайм работы устройства, такое ощущение, что вывод через отладочный JTAG подтормаживает работу устройства,
по сравнению с обычной работой без лога или с логом в UART. Правда пробовал это не через SWD, а через JTAG. И может что-то не так сделал.
Но, имхо, работа с подключенным эмулятором и без оного - бывает несколько разной и нужно иметь возможность отладки и без подключенного эмулятора.
esaulenka
Цитата(jcxz @ Jun 16 2016, 06:26) *
Да и как-то пробовал я выводить отладку через J-Link, имхо: при этом нарушается реалтайм работы устройства, такое ощущение, что вывод через отладочный JTAG подтормаживает работу устройства,
по сравнению с обычной работой без лога или с логом в UART. Правда пробовал это не через SWD, а через JTAG. И может что-то не так сделал.

Ну ещё бы. Semihosting - это старый механизм. Довольно гибкий, но крайне медленный:
- софт в контроллере на каждый putchar() выставляет брекпоинт.
- отладчик "ловит" этот брекпоинт, считывает переданный байтик (по определённой комбинации регистров, насколько я помню), отправляет в консоль.
Помимо двунаправленной консоли, можно ещё кучу "плюшек" организовать, но, вроде б, это так никто и не поддержал. Подробности есть на arm.com в разделе "ARM Compiler Software Development Guide" -> "Semihosting".
Но постоянные остановки ядра на пользу реалтайму не идут, конечно же.

SWO - это совсем другая штука. Ядро кладёт байтик в специальный регистр, а дальше "оно само". Но тут канал однонаправленный (впрочем, в 99% случаев отладочный канал такой и нужен).

Цитата(jcxz @ Jun 16 2016, 06:26) *
Но, имхо, работа с подключенным эмулятором и без оного - бывает несколько разной и нужно иметь возможность отладки и без подключенного эмулятора.

Это если только энергосбережение какое-то отлаживать. Но там и внешний уарт мешать будет.
А так - SWD и SWO штуки независимые, можно использовать только что-то одно.
x893
Можно использовать $1 JLink и RTT
Нужно 3 провода минимум

GND
SWD
SWC
AlexandrY
Странно.
Куча разработчиков, но только единицы заботит быстродействие отладочного канала.
Хотя от этого напрямую зависит производительность программиста встраиваемых систем.

Короче так:

Скорость вывода по SWO вот в таком цикле :
Код
#define TESTBUF_SZ 1024
char testbuf[TESTBUF_SZ];


  for (i=0;i<1000;i++)
  {
    fwrite(testbuf, 1 , TESTBUF_SZ, stdout);
  }

будет:

J-Link Ultra+ - 2.7 Мбайт/с
J-Link - 480 Кбайт/с
ST-Link/V2 - 160 Кбайт/с
zltigo
QUOTE (ar__systems @ Jun 15 2016, 17:31) *
программатор в 10 раз быстрее грузит. Зачем делать то, что можно не делать? Загрузчик, софт для него.

Это иллюзия, поскольку упираетесь в скорость записи во Flash а не в скорость передачи. Это раз. Загрузчик для серийного изделия по любому делать надо. Это два.
Ну и на лишний разъем это Вы жаловались, а не я.


QUOTE (NeDoEng @ Jun 15 2016, 20:32) *
Да, можно так, но в одно движение из Кейла вряд ли получится загрузить.

Получится в одно движение из терминальной программы.
NeDoEng
Цитата(AlexandrY @ Jun 16 2016, 14:13) *
Странно.
Куча разработчиков, но только единицы заботит быстродействие отладочного канала.
Хотя от этого напрямую зависит производительность программиста встраиваемых систем.

Короче так:

Скорость вывода по SWO вот в таком цикле :
Код
#define TESTBUF_SZ 1024
char testbuf[TESTBUF_SZ];


  for (i=0;i<1000;i++)
  {
    fwrite(testbuf, 1 , TESTBUF_SZ, stdout);
  }

будет:

J-Link Ultra+ - 2.7 Мбайт/с
J-Link - 480 Кбайт/с
ST-Link/V2 - 160 Кбайт/с


Понятно, что не для каждой задачи нужна максимальная скорость обмена.
Даже 160 кбайт/с неплохой результат, а значит вывод отладочной информации через ST-Link/V2 тоже имеет право на жизнь.
За вывод отладочной информации отвечает модуль ITM. Вот только не пойму -начиная с адреса 0xE0000000 расположены 32 32-х разрядных регистра (Stimulus port). Т.е. в любой из них кладем данные для передачи. И есть в регистре "ITM trace control" 23 бит - Busy. Как я понял - бит сигнализирует о занятости передатчика. Один на всех что ли? Тогда получается все как в UART - буфер передатчика и флаг занятости.
В общем, надо как-то это дело попробовать.

esaulenka, верно в 99% случаев достаточно одностороннего обмена.
x893
Цитата(AlexandrY @ Jun 16 2016, 14:13) *
Странно.
Куча разработчиков, но только единицы заботит быстродействие отладочного канала.
Хотя от этого напрямую зависит производительность программиста встраиваемых систем.

Короче так:

Скорость вывода по SWO вот в таком цикле :
Код
#define TESTBUF_SZ 1024
char testbuf[TESTBUF_SZ];


  for (i=0;i<1000;i++)
  {
    fwrite(testbuf, 1 , TESTBUF_SZ, stdout);
  }

будет:

J-Link Ultra+ - 2.7 Мбайт/с
J-Link - 480 Кбайт/с
ST-Link/V2 - 160 Кбайт/с


Сравните со скоростью передачи через RTT
https://www.segger.com/jlink-rtt.html
раздел
Performance
NeDoEng
Цитата(x893 @ Jun 16 2016, 16:12) *
Сравните со скоростью передачи через RTT
https://www.segger.com/jlink-rtt.html
раздел
Performance

Слыхал про RTT, но как-то не придал значения. Однако... Даже за 60 баксов можно получить колоссальную скорость.
AlexandrY
Цитата(x893 @ Jun 16 2016, 16:12) *
Сравните со скоростью передачи через RTT


Фишка RTT в том что он работает без ожидания готовности на основе буфера произвольного размера. Переполнения при этом фиксируются.
Поэтому его можно применять для логирования прерываний, переключения контекста, сервисов RTOS и прочих мелких и разреженных явлений без деградации реалтайма.

SWO же требует готовности на каждое слово, поэтому неминуемо замедлит логирование и испортит тайминги хоть и имеет большую пропускную способность чем RTT.

Я использую HS USB если нужен действительно быстрый канал для чего-то типа J-Scope.
jcxz
Цитата(esaulenka @ Jun 16 2016, 13:38) *
SWO - это совсем другая штука. Ядро кладёт байтик в специальный регистр, а дальше "оно само". Но тут канал однонаправленный (впрочем, в 99% случаев отладочный канал такой и нужен).

Если так, имхо - это сводит его полезность почти к нулю.

Цитата(NeDoEng @ Jun 16 2016, 18:50) *
esaulenka, верно в 99% случаев достаточно одностороннего обмена.

Может быть Вам. А мне в 100% случаев нужен двусторонний канал отладки.

Цитата(AlexandrY @ Jun 16 2016, 20:14) *
Я использую HS USB если нужен действительно быстрый канал для чего-то типа J-Scope.

USB для обычного лога не очень хороший выбор, так как для отладки: чем проще периферия, чем меньше требует ресурсов и чем раньше она запускается от момента старта ПО, тем лучше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.