Zrozumienie procesu kompilacji / łączenia / przesyłania (więc nie muszę używać IDE)

10

Zacząłem grać z arduino UNO całkiem niedawno (bez wcześniejszego doświadczenia z mikrokontrolerami). Chciałbym używać emacsa zamiast IDE, a także chciałbym wiedzieć, co robi IDE pod maską, aby móc napisać własny plik makefile. Samouczki, które znalazłem, są albo nieaktualne, albo przedstawione jako seria kroków bez żadnego wyjaśnienia. Byłbym wdzięczny, gdyby ktoś mógł mi wyjaśnić, jak działa cały proces kompilacji / łączenia / wysyłania za pomocą gcc-avr i avr-dude oraz w jaki sposób jest on wykorzystywany przez IDE.

Popiół
źródło
5
Możesz zajrzeć pod maską, pokazując „Pokaż pełne dane wyjściowe podczas: ☑ kompilacji ☑ wysyłania” W obszarze Plik → Preferencje.
jippie
Prawie duplikat: Kompilowanie kodu przez terminal . Zobacz linki do arduino-buildera i Sudar Muthu 'Makefile w mojej odpowiedzi na to pytanie.
Edgar Bonet

Odpowiedzi:

12

Jeśli chcesz dokładnego powielenia tego, co robi IDE, ale chcesz, aby był sterowany z wiersza poleceń, właśnie do tego służy Ino . Pełny proces kompilacji Arduino polega na kopiowaniu wielu plików z wielu miejsc i zwykle nie jest trywialny do powielenia.

Jeśli jesteś gotowy puścić pliki .ino i biblioteki Arduino, otrzymasz znacznie prostszy zestaw narzędzi. avr-gcc kompiluje, avrdude uploads i gotowe. Oto jeden z moich plików makefile z prostego projektu:

CC=avr-gcc
CXX=avr-c++
CXXFLAGS=-Wall -Wextra -mmcu=atmega1284p -Os
CFLAGS=$(CXXFLAGS)
BINARY=ledmatrix
OBJECTS=

all: $(BINARY)
@avr-size $<

$(BINARY): $(OBJECTS)

clean:
@rm -f $(BINARY) $(BINARY).hex $(OBJECTS)

upload: $(BINARY).hex
@avrdude -c usbasp -p m1284p -U flash:w:$<:i

%.hex: %
@avr-objcopy -j .text -j .data -O ihex $< $@

.PHONY: all clean upload

W przypadku kopiowania i wklejania pamiętaj o zastąpieniu wszystkich znaków „↹” znakami tabulacji.

EDYTOWAĆ:

Utworzyłem repozytorium z moim systemem kompilacji na Github .

Ignacio Vazquez-Abrams
źródło
Dzięki, twój plik makefile jest prawie tym, co próbowałem wymyślić. Ale wydaje mi się, że pozbycie się bibliotek oznacza, że ​​nie będę mógł korzystać z funkcji takich jak digitalWrite ()? W takim przypadku, gdzie powinienem szukać ich zwykłych odpowiedników w języku C?
Ash
1
Biblioteki Arduino zawierają ich odpowiedniki, ale mogą być nieco erudycyjne do czytania. Polecam znalezienie samouczka AVR niskiego poziomu do omówienia, który objaśni ci różne rejestry i urządzenia peryferyjne. Aha, i arkusz danych. Zawsze otrzymuj arkusz danych.
Ignacio Vazquez-Abrams