Как стать автором
Обновить

Комментарии 21

А можно чуть подробнее, чем в известных IDE отладка плоха? В той же бесплатной и довольно жирной STM32CubeIDE, или все ради того, чтобы SWD не использовать, а только USB?
К IDE описываемое решение никак не относится, более того, именно STM32CubeIDE автор упомянул. Здесь идея в том, чтобы избавиться от отдельного отладчика (ST-Link, JLink), перенеся его функции прямо в отлаживаемое устройство.
Спасибо. Было неочевидно.
При этом, кто-то все равно на начальном этапе должен произвести прошивку данного загрузчка, на который тратится 25% флэша + другие ограничения.
Конечно, ограничения имеются. Но, при этом, не требуется внешнего аппаратного отладчика. Представьте, что интерфейс USB будет заменен на UART, подключенный к сети GSM (GSM-модуль). В таком случае, отладка может производится на устройстве, которое находится в любой точке планеты. Не будете же в каждое устройство добавлять st-link и сервер к нему. Или, например, Вы пожелаете в массы выпустить что то arduino-подобное, но с возможностью отладки. В одной из статей, читал, что загрузчик Arduino для STM32 занимал 20Kb, а тут отладчик вместе с загрузчиком всего 10Kb. Могу привести еще примеры, но сначала хочу выпустить изделие использующее данный функционал. А это было просто прототипирование.

Касательно причины ограничений. Приоритеты прерываний доступны в диапазоне 0x40-0xF0. Это связано с тем, что обработчик прерывания отладочного интерфейса (USB), должен уметь прерывать обработчик DebugMon, а DebugMon — любые прерывания в прошивке. Еще задействован SysTick, который отсчитывает системное время в миллисекундах и SVC, который позволяет делать системные вызовы «printf», intEnable/intDisable, millis.
Отличная работа!
«Нижний уровень GDB-сервера выполнен с использованием библиотеки WinUSB.» — а что работает на кристалле? Вот за этим наверняка стоит куча всего интересного, что стоило бы рассмотреть. Тогда каждый смог бы по такому туториалу написать себе remote debugger хоть на AVR. Я бы хотел прочитать такой туториал!

На процессорах с архитектурой ARM используется отдельный отладочный модуль, который доступен программно. Он поддерживат точки останова, пошаговый режим. Для каждого из этих событий вызывается прерывание. С AVR будет несколько сложнее. Но, если поискать в интернете, имеются статьи на эту тему. Читал, как специалисты использовали прерывание таймера, настроив его таким образом, чтобы оно вызывалось через каждую команду процессора и таким образом эмулировали step-режим. Насколько я помню, для AVR, это один такт для команд не связанных с переходами. Команды ветвления вызывают нарушение работы конвейра, что приводит к выполнению команды за два такта.
Ксательно статей. У меня имеется желание разработать цикл статей по обучению программированию и радиоэлектронике в целом. Начиная от того как работает транзистор, и заканчивая циклом статей по клмпьютерным сетям информационной безопасности и.т.д. Я потратил всю свою сознательную жизнь на изучение такого обьема инфомации. Постараюсь изложить все в сжатом виде. Но это по наличию свободного времени.

Спасибо, я не знал про подход с таймером.
Думаю это потрясающая работа, я бы хотел отслеживать ее — возможно какие-то замечания помогут сделать ее лучше. Почему бы вам не начать ее на гитхабе?
Получилась почти полноценная отладка, с breakpoint-ами, шагами, и.т.д. плюс нечто похожее на semihosting.

Видео по ссылке "Видео работы с платой в среде STM32CubeIDE"
не доступно.

Видео, с демострацией как происходит процесс отладки, доступно по ссылке: youtu.be/sllNL5L_Tb0 Плата, при этом подключена только по USB. При попытке добавить видео, по какой то причине, переход по ссылке происходит куда то еще. Видимо я что то делаю не так.
Converting an STM32F103 board to a Black Magic Probe
Using the $2 (Blue Pill) STM32 board we can have a debugger that supports breakpoints. No need of OpenOCD server, as it runs a GDB server on chip directly.


paramaggarwal.medium.com/converting-an-stm32f103-board-to-a-black-magic-probe-c013cf2cc38c

blog.linuxbits.io/2016/02/15/cheap-chinese-st-link-v-2-programmer-converted-to-black-magic-probe-debugger
Собственно, я и использовал часть кода BlackMagic, отвечающую за разбор GDB-пакетов в ПО, которое крутиться на ОС Windows. Но задумка немного другая. Представим, что в проекте, будет применяться другой канал. Например GSM. У типовых GSM модулей только один последовательный порт. Получается, я должен буду к BlackMagic добавить функционал, который пробрасывает TCP/IP через него для доступа основного контроллера в сеть. Это неплохой вариант для временных решений, но когда речь идет о массовом коммерческом производстве, считают каждую копейку.
Я давно занимаюсь разработкой радиоэлектроники и программированием встраиваемых систем. Раньше, бывали случаи, когда ради экономии, код прошивок переписывался на ассемблере для того, чтобы поставить контроллер подешевле. Не говоря уже об установке дополнительного контроллера в продукции. А для отладки можно использовать обычный ST-Link, J-Link, BlackMagic, WindRiver ICE или что то еще. В любом случае, это небольшой вклад в стоимость конечной продукции.
К примеру, появилась у меня мысль внести свой вклад в развитие отечественной электроники. Что я могу сделать как разработчик электроники (но не чипов)? Если посмотреть на Миландр, у них есть решения на базе ядра ARM. Как поднять отечественную электронику? Насколько мне известно (поправьте меня, если я не прав), сфера производства чипов является дотационной в большинстве стран мира. Но нужно сделать так, чтобы государство профинансировало не создание миконтроллеров, а создание продукции на базе этих микроконтроллеров. Например Arduino на базе ARM от Миландр. Нужно только чтобы это был не распил-проект, а действительно то, что пойдет в массы. Процесс запуститься от вложения государственных денег в «МиландрДуинки», а после популяризации, они уже будут испольоваться наравне с Arduino. Это создаст рынок для Миландра и запустит процесс. Не все нужно делать, только на оборонку и для того чтобы доказать что мы тоже можем, но в пять-пядесят раз дороже. Сделать конкурентноспособной плату на более дорогом контроллере нельзя. А вот если отказаться от второго чипа на элементной базе «уже не за 2$», то она станет дешевле. Буду рад, если кто то возьмет идею на вооружение.
Уважаемый автор. Мой комментарий не содержит какого-то существенного смысла, касающегося темы статьи. Работаю инженером по автоматизации и учусь программировать на С++. Мечтаю однажды написать собственную SCADA и сервер для облачного мониторинга. Не знаю, смогу ли.
В последнее время, когда я вбиваю в поисковике браузера что-то вроде «LPCWSTR что это», передо мной всё чаще одними из первых ссылок появляются ссылки на статьи хабра. И каждый раз я открываю эти ссылки, читаю всё написанное на одном дыхании, не моргая, и выношу для себя потрясное количество полезной информации. И также много потрясной информации в комментариях.
Сегодня прочитал про кодировки. Это стало последней каплей. Я зарегался на хабре. Потом увидел Вашу статью.
Пока что это мой первый комментарий на хабре. Всё написанное Вами я постарался намотать на ус, мб пригодится когда-нибудь — в какой-то ситуации вспомню, что была такая статья на хабре, вернусь, перечитаю и смогу таки доделать своё великое дело.
В первую очередь, хотел бы пожелать Вам удачи в любых Ваших начинаниях. Я стал заниматься радиоэлектроникой и программированием в пятом классе школы. Всю мою жизнь я жил и зарабатывал именно этим. В 7 классе мне был подарен мой первый, тогда еще аналоговый, осциллограф С1-55. К сожалению или счастью как радиоэлектроника, так и программирование это очень обширные темы. Радиоэлектроника включает в себя аналоговую схемотехнику, цифровую схемотехнику, высокочастотную схемотехнику как подраздел аналоговой схемотехники. Из этих трех направлений я хорошо знаком с первыми двумя. Программирование можно разделить на программирование встраиваемых систем, как подраздел системного программирования, системное программирование в целом (разработка драйверов и модулей ядра ОС), прикладное программирование начиная от низкоуровневых библиотек взаимодействующих с системными вызовами операционной системы, до разработки прикладных приложений, разработка скриптов, и т.д. Касательно тематики программирования. Тут у меня большой опыт работы со встраиваемыми системами. Я могу разработать драйвера для практически любой операционной системы (просто где то необходимо будет ознакомится с тех. документацией). Большой опыт разработки ПО для микроконтроллеров. Думаю ответ на свой вопрос про «LPCWSTR» вы уже и сами нашли. Это лишь вопрос о соглашении именования. Например в исходных кодах ОС VxWorks по крайне мере до 5й версии применялся только язык «C». Насколько я помню, эта ОС использует соглашения вида typedef struct _XXXX {… } XXXX, *pXXXX; в том числе для «эмуляции классов». Т.е. первым параметром передается указатель на структуру. В этом случае XXXX — имя структуры, XXXX — тип структуры, pXXXX — указатель на тип структуры. При работе с Windows API, приняты несколько иные соглашения. В данный момент я точно не помню, но постараюсь объяснить логически. L — насколько я знаю, указывает что это Long т.е. длинный, P — указывает что это указатель, т.е. это аналог маленькой «p» для VxWorks, C — не помню, W — Wide — т.е. используется двухбайтовый набор UNICODE, а не одно-байтовый, STR — означает что это строка. Касательно программирования под ОС Windows, у меня не такой большой опыт. Я разработал только пару драйверов под данную ОС и некоторое количество тестовых приложений. Вообще специфика Embedded программирования отличается тем, что почти не используются такие библиотеки как boost или stl, т.к. на микроконтроллерах остро стоит проблема фрагментации памяти, а данные библиотеки активно используют алокацию и освобождение памяти.
В первую очередь, хотел бы пожелать Вам удачи в любых Ваших начинаниях. Я стал заниматься радиоэлектроникой и программированием в пятом классе школы. Всю мою жизнь я жил и зарабатывал именно этим. В 7 классе мне был подарен мой первый, тогда еще аналоговый, осциллограф С1-55. К сожалению или счастью как радиоэлектроника, так и программирование это очень обширные темы. Радиоэлектроника включает в себя аналоговую схемотехнику, цифровую схемотехнику, высокочастотную схемотехнику как подраздел аналоговой схемотехники. Из этих трех направлений я хорошо знаком с первыми двумя. Программирование можно разделить на программирование встраиваемых систем, как подраздел системного программирования, системное программирование в целом (разработка драйверов и модулей ядра ОС), прикладное программирование начиная от низкоуровневых библиотек взаимодействующих с системными вызовами операционной системы, до разработки прикладных приложений, разработка скриптов, и т.д. Касательно тематики программирования. Тут у меня большой опыт работы со встраиваемыми системами. Я могу разработать драйвера для практически любой операционной системы (просто где то необходимо будет ознакомится с тех. документацией). Большой опыт разработки ПО для микроконтроллеров. Думаю ответ на свой вопрос про «LPCWSTR» вы уже и сами нашли. Это лишь вопрос о соглашении именования. Например в исходных кодах ОС VxWorks по крайне мере до 5й версии применялся только язык «C». Насколько я помню, эта ОС использует соглашения вида typedef struct _XXXX {… } XXXX, *pXXXX; в том числе для «эмуляции классов». Т.е. первым параметром передается указатель на структуру. В этом случае XXXX — имя структуры, XXXX — тип структуры, pXXXX — указатель на тип структуры. При работе с Windows API, приняты несколько иные соглашения. В данный момент я точно не помню, но постараюсь объяснить логически. L — насколько я знаю, указывает что это Long т.е. длинный, P — указывает что это указатель, т.е. это аналог маленькой «p» для VxWorks, C — не помню, W — Wide — т.е. используется двухбайтовый набор UNICODE, а не одно-байтовый, STR — означает что это строка. Касательно программирования под ОС Windows, у меня не такой большой опыт. Я разработал только пару драйверов под данную ОС и некоторое количество тестовых приложений. Вообще специфика Embedded программирования отличается тем, что почти не используются такие библиотеки как boost или stl, т.к. на микроконтроллерах остро стоит проблема фрагментации памяти, а данные библиотеки активно используют алокацию и освобождение памяти.

Вопрос такого характера: планируется ли использование драйвера libusb вместо WinUSB для обеспечения совместимости с Linux и Android, например?

Изначально решение закладывалось для работы в другой категории. USB был выбран как наиболее удобный интерфейс для данной платы. В целом, добавить поддержку LibUSB будет не сложно. Я подумаю над этим вопросом, но после того, как найду время на причесывание исходного кода.
В Android же, если мне не изменяет память, возможны два варианта работы с USB. Либо LibUSB, собранный при помощи NDK, либо API предоставляемое ОС. Если потратить некоторое количество времени и реализовать GDB сервер на Java, можно вообще обойтись без Native-кода.

Автор, что-то тебя заклевали. Делаю прошивки уже 7 лет, и то что ты сделал офигенно круто!

Добрый вечер! Да, в целом получилось неплохое решение. Но у меня имеется некоторый опыт коммерческой разработки ( Intel, Antilatency, Qualinet Systems ) и большой в государственных компаниях. Этот код в компаниях первой группы я бы комитить постеснялся. А в целом,- да. Решение работает.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.