Что происходит на заднем плане, когда mbed CLI прошивает чип?

Несмотря на то, что не все детали имеют отношение к этому вопросу, я все же перечислю свои настройки:

Чтобы скомпилировать мой код и прошить двоичный файл на чип, я ввожу следующую команду в свой терминал cmd:

> mbed compile -t GCC_ARM -m NUCLEO_F746ZG --flash

Получаю следующий результат:

...

+------------------+-------+-------+-------+
| Module           | .text | .data |  .bss |
+------------------+-------+-------+-------+
| [fill]           |   130 |     4 |    10 |
| [lib]\c.a        | 24965 |  2472 |    89 |
| [lib]\gcc.a      |  3120 |     0 |     0 |
| [lib]\misc       |   252 |    16 |    28 |
| mbed-os\drivers  |   658 |     4 |   100 |
| mbed-os\features |    74 |     0 | 12556 |
| mbed-os\hal      |  2634 |     4 |    66 |
| mbed-os\platform |  2977 |     4 |   270 |
| mbed-os\rtos     | 15887 |   168 |  5989 |
| mbed-os\targets  | 16013 |     4 |  1052 |
| source\main.o    |   244 |     4 |    84 |
| Subtotals        | 66954 |  2680 | 20244 |
+------------------+-------+-------+-------+
Total Static RAM memory (data + bss): 22924 bytes
Total Flash memory (text + data): 69634 bytes

Image: .\BUILD\NUCLEO_F746ZG\GCC_ARM\nucleo_f746zg_demo.bin
[mbed] Detected "NUCLEO_F746ZG" connected to "E:" and using com port "COM10"
        1 file(s) copied.

Меня особенно интересуют последние строки, где происходит собственно мигание чипа:

Image: .\BUILD\NUCLEO_F746ZG\GCC_ARM\nucleo_f746zg_demo.bin
[mbed] Detected "NUCLEO_F746ZG" connected to "E:" and using com port "COM10"
        1 file(s) copied.

Я знаю из предыдущего опыта (до того, как появился mbed CLI), что для прошивки двоичного файла на чип происходит много всего. Например, мне пришлось запустить openocd, передать ему файл конфигурации программатора (например, stlink-v2-1.cfg) и файл конфигурации целевой платы (например, nucleo_f746zg.cfg). Наконец, мне пришлось передать двоичный файл openocd через Telnet-сессию или GDB-сессию. Здесь все подробно описано: Как использовать GDB (Gnu Debugger) и OpenOCD для отладки микроконтроллера - из терминала?

Глядя на mbed CLI, перепрошивающий чип, я запутался. Что происходит на заднем плане? Использует ли mbed CLI тайно openocd для подключения к чипу? Или, возможно, pyOCD? Или как-нибудь иначе?


person K.Mulier    schedule 09.02.2018    source источник
comment
Держу пари. Он копирует файл bin на диск e: и использует com10 как UART ‹› SERIAL VCOM.   -  person 0___________    schedule 10.02.2018


Ответы (2)


mbed-cli имеет открытый исходный код, вы можете найти репозиторий здесь. Если вы выполните поиск по запросу "def compile_", вы найдете конкретный код того, что происходит при запуске mbed compile.

mbed-cli использует mbed-ls для обнаружения вашей доски и htrun, чтобы его прошить. htrun имеет множество плагинов для копирования на разные доски, включая pyocd но в самом простом случае он просто копирует на диск, обнаруженный с помощью mbed-ls.

person Stephen Paulger    schedule 09.02.2018

Я не пробовал все из них, но первая и, конечно же, нуклео-платы, поддерживаемые mbed, отображаются как виртуальный флэш-накопитель, и вы просто копируете файл .bin поверх, никакого реального волшебства со стороны хоста не требуется никакого другого программного обеспечения, кроме что уже есть в операционной системе по монтированию usb флешек. На этих платах есть отладочный заголовок, и даже если это не так, для тех, которые я знаю, микроконтроллер, который управляет частью отладки, я называю это отладочным микроконтроллером, то есть тестируемый микроконтроллер или демонстрационный, который вы купили доска для игры. Обычно mbed были arm, и есть интерфейс swd (jtag-ish), скорее всего, mcu отладки использует этот интерфейс.

openocd - это всего лишь один инструмент, который знает протокол swd, это не означает, что они должны запускать openocd на mcu. вы можете написать свое собственное программное обеспечение для бит-бэка или поговорить с чипом ftdi, чтобы использовать mpsse или другое решение для генерации переходов протокола swd на этой шине.

В простейшем случае микропрограмма для конкретной платы Nucleo должна знать только один stm32, который она программирует, и не обязательно знать больше, но один swd является в некотором роде общим и может иметь смысл иметь более общую микропрограмму отладки mcu.

Теперь эти NUCLEO и другие отладочные mcus STM32 также говорят на stlink, который отделен от прошивки, выглядит как сделка с флэш-накопителем. Stlink протокол, который хост может использовать, чтобы запросить mcu отладки, чтобы что-то сделать, точно так же, как mpsse - это протокол / набор инструкций, который вы используете, чтобы попросить некоторые части ftdi сделать что-то для вас (немного другое, но по идее говорите по одному протоколу для прокси-агент, который что-то делает за вас).

Этот mbed cli, возможно, просто копирует файл для вас, что вы могли бы сделать сами. Или, может быть, речь идет о каком-то другом протоколе. Первые mbeds были основаны на частях NXP, а не на ST, и, следовательно, не имели протокола stlink во внешнем интерфейсе. У них была / есть просто копия двоичного файла, который, как я помню, видел в чьем-то блоге, так что, возможно, они наняли этого человека или позаимствовали этот проект с открытым исходным кодом.

Хотя песочница mbed может быть отличной, я рекомендую вам попробовать другие варианты: сначала mbed для сборки двоичного файла, затем его копирование, mbed для его сборки и, возможно, openocd через stlink, чтобы записать его во флэш-память. Детали ST и NXP традиционно имеют загрузчик, который поддерживает протокол uart, который вы можете попробовать, так как это то, что вы, скорее всего, использовали бы, или swd, чтобы попасть в чип на плате, если вы работали над каким-то продуктом, построенным на основе или в котором использовались такие чипы, но это не была какая-то доска для хобби / оценки, как нуклео. Я также рекомендую попробовать baremetal без библиотек, просто прочтите руководство, я считаю, что это проще, чем библиотеки, YMMV, также у ST есть хотя бы один набор собственных библиотек, я думаю, они находятся в переходе между программными решениями, возможно, попробуйте оба или попробуйте новый, так как другой потеряет поддержку.

Вы также можете получить спецификацию SWD, и есть github и другие открытые проекты, которые могут помочь, возьмите свою плату Nucleo и разработайте программу на одном MCU, чтобы разговаривать с другим (у mcus есть gpio, что делает его простым способом бит-бэка, вы можете укусить ударить часть ftdi или делать другие вещи, не используя mcu) и попытаться изучить / понять сам этот протокол. На данный момент он используется всеми cortex-ms.

Существует также протокол USB, такой как stlink, который проталкивается рукой, более новые стартовые панели MSP432 используют его или поддерживают. Сам протокол stlink в этом отношении.

В любом случае, я отвлекся от нуклео через (отладочный) usb, имеет протокол stlink и имеет вещь, которую я использую для флэш-накопителя, поэтому инструменты mbed, вероятно, используют один из них, вероятно, последний, поскольку stlink, скорее всего, не найден на нестандартных продуктах. Очень вероятно, что mcu отладки использует swd для программирования mcu разработки / демонстрации, не знаю, как еще он это делал бы.

person old_timer    schedule 09.02.2018
comment
Маловероятно - точно - просто скачайте схемы нуклео-платы. - person 0___________; 10.02.2018
comment
Кто использует интерфейс stlink, кроме st Board? Не ti, не mbed платы nxp. Существуют эти USB-ключи stlink, которые, вероятно, не являются стандартными, но это не eval / hobby доски с микроконтроллером разработки, который является инструментом для использования (на большинстве) любых устройств swd. - person old_timer; 10.02.2018
comment
Я не понимаю. Но для вспышки используется SWD. - person 0___________; 10.02.2018
comment
Спасибо @old_timer, очень интересно :-) - person K.Mulier; 10.02.2018