Programovanie Arduino (a derivátov) bez Arduino IDE #3
Prepínať sa do terminálu a spúšťať príkazy kompilácie je otrava. Radšej si to zakomponujeme do iného IDE. A aby to nebolo stále len o Emacse, tak to budem aplikovať v Geany.
Obsah minulej časti + čo je to Makefile?
V minulej časti sme si stručne ukázali, ako využiť arduino-cli na zostavenie a nahratie programu pre (nielen) Arduino z príkazového riadku. S nahrávaním takýmto spôsobom by sme sa ešte zmierili, ale spúšťať kompiláciu, pamätať si čísla riadkov, v ktorých je chyba, a potom tam ručne skákať, to by bol krok späť, s porovnaním s originálnym Arduino IDE.
Ani zadávanie celého príkazu nie je pohodlné, hoci aj s využitím histórie shellu.
Preto si na to spravíme skript - a hoci by mohol byť aj nejaký klasický bash-ový, využijeme na to tzv. Makefile.
Múdra definícia vraví, že: "Makefile je súbor obsahujúci pravidlá a akcie určené na automatizáciu procesu kompilácie a spustenia programov v rámci vývojového prostredia. Tento súbor definuje závislosti medzi zdrojovými kódmi a objektovými súbormi, ako aj príkazy potrebné na kompiláciu a linkovanie programu. Makefile je často používaný v projektoch napísaných v jazykoch C a C++, ale môže byť použitý aj pre iné programovacie jazyky."
Nevýhodou Makefile je trochu odlišná syntax, ktorá je špecificky navrhnutá na definovanie cieľov a akcií, ktoré majú byť vykonané pri kompilácii projektu.
Avšak je možné použiť bash príkazy aj v Makefile súbore, aby sa dosiahla väčšia flexibilita a zložitejšie operácie pri automatizácii kompilácie projektov.
Makefile s využitím arduino-cli
Tak si rovno ukážme, ako taký súbor Makefile vyzerá. Je treba poznamenať, že názov súboru musí byť Makefile
, s veľkým "M" na začiatku.
PROGRAM ?= $(wildcard ./*.ino) PORT ?= $(shell ls /dev/ttyACM* | /usr/bin/grep -o '/dev/ttyACM.*') FQBN ?= arduino:avr:uno ARDUINO-CLI-BIN ?= /home/richard/.arduino15/arduino-cli kompiler-verify ?= $(ARDUINO-CLI-BIN) compile -b kompiler-verbose ?= $(ARDUINO-CLI-BIN) compile -v -b kompiler-upload ?= $(ARDUINO-CLI-BIN) upload -v -b ### Arduino dosky #FQBN ?= arduino:avr:leonardo #FQBN ?= arduino:avr:uno ### IndustrialShields dosky # napr.: #FQBN ?= industrialshields:avr:mduino:cpu=mduino42plus #FQBN ?= industrialshields:avr:ardbox:cpu=ardboxanaloghfplus485 #FQBN ?= industrialshields:avr:ardbox:cpu=ardboxanaloghfplus232 all: $(ARDUINO-CLI-BIN) compile -b $(FQBN) $(PROGRAM) verbose: $(ARDUINO-CLI-BIN) compile -v -b $(FQBN) $(PROGRAM) upload: @echo "Upload >>>" @if test -e /dev/ttyACM*; then \ echo "Zariadenie na $(PORT) pripojené"; \ $(ARDUINO-CLI-BIN) upload -v -b $(FQBN) -p $(PORT) $(PROGRAM); \ else \ echo "Zariadenie na /dev/ttyACM* nepripojené"; \ fi fqbn: $(ARDUINO-CLI-BIN) board listall
Trochu si to rozoberme:
PROGRAM ?= $(wildcard ./*.ino)
Vytvoríme si premennú PROGRAM, do ktorej si načítame názov súbor s príponou ino (môže byť len jeden taký súbor v adresári s Makefile, inak ho treba explicitne definovať).
PORT ?= $(shell ls /dev/ttyACM* | /usr/bin/grep -o '/dev/ttyACM.*')
ttyACM je systémový súborový symbolický odkaz, ktorý sa používa na komunikáciu s USB zariadeniami pripojenými k počítaču cez sériový port (niekedy je to i ttyUSB, ale to som videl hádam iba raz v živote).
FQBN ?= arduino:avr:uno
Je plný kvalifikovaný názov dosky, ako sme si o ňom hovorili v 2. časti seriálu.
ARDUINO-CLI-BIN ?= home/richard.arduino15/arduino-cli
Je cesta k binárke arduino-cli.
kompiler-verify ?= $(ARDUINO-CLI-BIN) compile -b
kompiler-verbose ?= $(ARDUINO-CLI-BIN) compile -v -b
kompiler-upload ?= $(ARDUINO-CLI-BIN) upload -v -b
Sú len také pomocné premenné, aby sme nemuseli tie reťazce písať celé v neskorších receptoch. Tie sa totiž konštruujú tak, aby boli ľahko upraviteľné práve zmenami premenných.
all, vebose, upload, fqbn
Sú konkrétne "recepty". To časti kódu, ktoré sa vykonajú, ak zavoláme z príkazového riadku príkaz make
.
all: sa vykoná, ak je make
bez parametrov, verbose, ak je príkaz make verbose
atď.
Zásadná informácia: príkazy v rámci receptov musia byť odsadené tabulátorom. Teda nie medzerami!
Dobrý textový editor na to upozorní 😉.
V recepte upload sú tieto zaujímavosti:
- @ pred bash príkazom spôsobí, že sa príkaz vykoná, ale nezobrazí sa samotný príkaz (teda
@echo "Upload >>>"
vypíše "Upload >>>", ale nie samotný príkazecho
). - Ak je príkaz viacriadkový, ako ten if, tak riadky sú zakončené znakom ; pre oddelenie jednotlivých príkazov v rámci jedného riadku a znakom \ pre pokračovanie príkazu na ďalšom riadku. Týmto zabezpečuje správne vykonanie príkazov v Makefile. Použitie týchto znakov je štandardnou praxou pri písaní Makefile a zvyšuje prehľadnosť a prenositeľnosť kódu.
A ešte:
V Makefile znamená ?= priradenie do premennej, ale iba ak ešte nebola definovaná. Ak premenná už má hodnotu, nedôjde k prepísaniu. Tento operátor je užitočný na definovanie predvolených hodnôt pre premenné v prípade, že by užívateľ nezadal žiadnu hodnotu.
Volanie make z (nejakého) IDE
Osobne používam roky Emacs, ale poznám aj Geany, ktoré je nenáročné, rýchle a má veľa pluginov a podporuje všakovaké jazyky.
Obr. 0: Info o Geany |
V nastavení zostavovania, ak už máme otvorený náš ino súbor - menu Zostaviť ⟶ Nastaviť príkazy pre zostavenie si nastavíme príkazy pre Zostavenie (build, build verbose), Nahratie (upload), a duplicitne môžme i Spustenie (tiež upload). Viď obrázok nižšie.
Obr. 1: Nastavenie príkazov pre zostavenie |
Ďalším fotkám stačí len komentár. Ešte dodám, že ak nastane pri kompilácii chyba, tak kliknutie na ňu nás teleportuje na príslušný riadok.
Obr. 2: Prebiehajúca kompilácia v spodnej časti obrazovky |
Obr. 3: Súbor Makefile v 2. tabe |
Obr. 4: Geany bez rušivých prvkov so "zbalenými" funkciami |
V iných IDE sa to určite nastavuje nejako obdobne. A určite je možné k tomu nastaviť i klávesovú skratku. Napr. ja som si z čias Turbo Pascal-u a Turbo C zvykol mať F9
na kompiláciu.
Obsah ďalšej časti
V budúcej časti si ukážeme malú odlišnosť pri práci s Rasperry Pi Pico.
Pre pridávanie komentárov sa musíte prihlásiť.