Pull to refresh

Обновление Прошивки из Make Скрипта

Level of difficultyEasy
Reading time4 min
Views2K

В чем проблема?

Я с удивлением узнал, что на российских предприятиях, где программируют микроконтроллеры часто у людей возникают проблемы просто с тем, чтобы банално залить прошивку в микроконтроллер. Сотрудники открывают GUI утилиту от вендора и не знают куда тыкать курсор.

У меня был случай, когда схемотехник по ошибке залил в микроконтроллер win *.rar файл в котором была прошивка, а потом жаловался мне, что моя прошивка не работает! Это как?...

В таких случаях схемотехник по 4 раза на дню приходит к программисту, чтобы программист ему пере прошил плату. Это странно хотя бы потому, что даже обычные люди без образования и то могут обновить прошивку на своем фитнес браслете. А тут сотрудники с российским высшим образованием не могут обновить прошивку. Это как? Непорядок...

Решение проблемы

Очевидно что надо сделать какой-то скрипт, который в одно касание обновит подключенное по SWD устройство.

Многим известны системы сборки для компьютерных программ. Некоторые пользуют GNU Make.

А что если я скажу, что систему сборки make можно использовать не только для сборки программ? Что если загружать прошивку тем же make скриптом? Есть только один способ это проверить...

По сути система сборки это интерпретируемый язык программирования. А значит на нём можно писать код, который может делать что полезное. Вот например можно на GNU Make написать код загрузки *.bin (аря) в микроконтроллер. Перед вами flash_target.mk скрипт для выбора алгоритма пере прошивки. Что же тут начертано?... Да, у нас в репозитории есть сборки под разные целевые архитектуры. Поэтому выбор "чиво-либо" происходит установкой переменных окружения во время прогона скриптов сборки.

$(info FlashTargetScript)

MAKE_SCRIPTS=$(WORKSPACE_LOC)/make_scripts

FLASH_TARGET=

ifeq ($(ARTERY), Y)
    FLASH_TARGET += flash_artery
endif

ifeq ($(CC26X2), Y)
    FLASH_TARGET += flash_cc26x2
endif

ifeq ($(ESP32), Y)
    FLASH_TARGET += flash_esp32
endif

ifeq ($(MILANDR), Y)
    FLASH_TARGET += flash_mdr32
endif

ifeq ($(NORDIC), Y)
    FLASH_TARGET += flash_nordic
endif

ifeq ($(STM), Y)
    FLASH_TARGET += flash_stm32
endif

# make flash
.PHONY: flash
flash: $(FLASH_TARGET)
	$(info FlashTargetDone)


ifeq ($(ARTERY), Y)
    include $(MAKE_SCRIPTS)/flash_artery.mk
endif

ifeq ($(CC26X2), Y)
    include $(MAKE_SCRIPTS)/flash_cc26x2.mk
endif

ifeq ($(ESP32), Y)
    include $(MAKE_SCRIPTS)/flash_esp32.mk
endif

ifeq ($(MILANDR), Y)
    include $(MAKE_SCRIPTS)/flash_mdr32.mk
endif

ifeq ($(NORDIC), Y)
    include $(MAKE_SCRIPTS)/flash_nordic.mk
endif

ifeq ($(STM), Y)
    include $(MAKE_SCRIPTS)/flash_stm32.mk
endif

Вот например, скрипт для пере прошивки Artery микроконтроллера утилитой ATLink_Console. Тут flash_artery это цель. То есть то, что надо сделать, а $(FIRMWARE_BINARY_FILE) это зависимость. То есть то, что должно быть, чтобы достигнуть цели. Далее просто идут действия... Произвести физический пуск утилиты ATLink_Console.exe с нужным пучком опций. Где опции разделены пробелами. Только и всего...

$(info Flash Artery MCU Script)

FIRMWARE_BINARY_FILE=$(BUILD_DIR)\$(TARGET).bin
VENDOR_FLASH_CLI_TOOL=ATLink_Console.exe
VENDOR_FLASH_CLI_OPTIONS=
VENDOR_FLASH_CLI_OPTIONS += -device $(ARTERY_DEVICE)
VENDOR_FLASH_CLI_OPTIONS += -connect -p --dfap 
VENDOR_FLASH_CLI_OPTIONS += --depp 
VENDOR_FLASH_CLI_OPTIONS += -d --a 08000000 
VENDOR_FLASH_CLI_OPTIONS += --fn $(FIRMWARE_BINARY_FILE) 
VENDOR_FLASH_CLI_OPTIONS += --v  
VENDOR_FLASH_CLI_OPTIONS += -r

.PHONY: flash_artery
flash_artery: $(FIRMWARE_BINARY_FILE)
	$(info Flash File:$(FIRMWARE_BINARY_FILE) ...)
	$(VENDOR_FLASH_CLI_TOOL) $(VENDOR_FLASH_CLI_OPTIONS)
	$(info FlashArteryMCUTargetDone)

а это справка по опциям консольной утилиты ATLink_Console.exe

Кликнули на скрипт и завертелось, лёд тронулся. Появился вот такой успешный лог отчёта в консоли.

Аналогично можно обновить из Make скрипта и прошивку для RISC-V микроконтроллера

$(info Flash Mik32 MCU Script)

FIRMWARE_BINARY_FILE=$(BUILD_DIR)/$(TARGET).hex
#PYTHON_BIN=python.exe
TOOLS_DIR=$(WORKSPACE_LOC)/../tool

TOOLS_DIR:= $(realpath $(TOOLS_DIR))
TOOLS_DIR := $(subst /cygdrive/c/,C:/, $(TOOLS_DIR))
#@echo $(error TOOLS_DIR=$(TOOLS_DIR))

# Probably it will need to disable all apps at port 6666
# netstat -aon | grep 6666
# tasklist | grep 6236
# taskkill /F /T /PID 6236

VENDOR_FLASH_CLI_TOOL:=  $(TOOLS_DIR)/tool_mik32/mik32-uploader/mik32_upload.py
MCU_OPEN_OCD_CONFIG=mik32.cfg
BOARD_OPEN_OCD_CONFIG=start-link.cfg

VENDOR_FLASH_CLI_OPTIONS =
VENDOR_FLASH_CLI_OPTIONS +=  $(FIRMWARE_BINARY_FILE) 
VENDOR_FLASH_CLI_OPTIONS += --run-openocd
VENDOR_FLASH_CLI_OPTIONS += --openocd-exec=openocd.exe
VENDOR_FLASH_CLI_OPTIONS += --openocd-interface=$(BOARD_OPEN_OCD_CONFIG)
VENDOR_FLASH_CLI_OPTIONS += --openocd-target=$(MCU_OPEN_OCD_CONFIG)
VENDOR_FLASH_CLI_OPTIONS += --adapter-speed=3200


.PHONY: flash_mik32
flash_mik32: $(FIRMWARE_BINARY_FILE) $(BOARD_OPEN_OCD_CONFIG) $(MCU_OPEN_OCD_CONFIG)
	$(info Flash File:$(FIRMWARE_BINARY_FILE) ...)
	$(PYTHON_BIN)  $(VENDOR_FLASH_CLI_TOOL) $(VENDOR_FLASH_CLI_OPTIONS)
	$(info Flash Mikron MCU Target Done)

Всё единообразно, унифицировано.

Достоинство прошивки из-под скриптов

++ Вы прошиваете в одно касание. По сути надо просто дзыкнуть по *.bat скрипту, который вызовет одну лишь команду: make flash. Далее всё как по волшебству произойдет само собой...

++Вы пишите только один скрипт и используете его-ещё для бесчисленного количества сборок. Причем скрипт сам автоматически поймет какой микроконтроллер нужен и вызовет нужную консольную утилиту от вендора для него. Вот так...

++При составлении скрипта пере прошивки Вы контролируете каждую опцию в управлении алгоритма обновления ПО. Каждый ключ. Вы понимаете, что происходит. У вас не происходит control leak (утечки управления).

++Вы никак не привязаны к своей GUI-IDE и мышке. Вы можете даже автоматизировать процесс пере прошивки на производстве.

Итоги

Удалось научиться пере прошивать микроконтроллер make кодом. В одно касание. Получился принцип одной кнопки. Вот так, просто и не затейливо. Кондовое решение.

Make скрипты - это как катализатор в химии. Благодаря GNU Make всё происходит быстрее.

Make - это всеядная утилита. Её всё равно какие программы вызывать и в этом вся прелесть! Понимаете?...

Прошивайте микроконтроллеры из GNU Make скриптов. В этом нет ничего сложного.

Ссылки

Only registered users can participate in poll. Log in, please.
Вы обновляете прошивку make кодом?
20% да4
80% нет16
20 users voted. 2 users abstained.
Only registered users can participate in poll. Log in, please.
Вы применяете скрипты сборки?
77.27% да17
22.73% нет5
22 users voted. 1 user abstained.
Only registered users can participate in poll. Log in, please.
Как вы прошиваете микроконтроллер по SWD/JTAG?
11.11% CLI утилитой от вендора и *.bat скриптом2
33.33% GUI утилитой от вендора щелкая курсором мышки6
27.78% из-под IDE (при том не знаю как GUI-IDE это делает, и знать не хочу)5
27.78% CLI утилитой от вендора, интегрировал обновление прошивки в систему сборки5
18 users voted. 4 users abstained.
Tags:
Hubs:
Total votes 10: ↑7 and ↓3+5
Comments20

Articles