Command line Arduino compiling and uploading?

后端 未结 11 829
长发绾君心
长发绾君心 2020-12-13 17:37

How do I compile and upload Arduino sketches from the command line on Mac and Linux? I\'ve installed the Arduino programming environment. Are there some sample makefiles an

相关标签:
11条回答
  • 2020-12-13 18:16

    You need to actually create a viable cpp file out of your arduino sketch. The arduino environment does that for you automatically. One trick to get to those files is to open your arduino preferences.txt (it's in ~/Library/Arduino on the mac, I think in your Documents and Settings or Application Data on windows, don't remember exactly), and set build.verbose=true and upload.verbose=true. Start arduino, and compile your sketch (don't upload it). The console at the bottom will show you which files were compiled. You can now go to that directory, which will contain the cpp file, and compiled object files for all the core arduino objects. You can copy those into your project and use the cpp file to do further hacking. Let me know if you need more information about the Makefile, I can provide you with those I have.

    0 讨论(0)
  • 2020-12-13 18:17

    This is my boilerplate gnu make include for AVR projects, you may need to adapt some of it to fit your environment. It creates dependencies, has a host of standard gcc options I find useful or that optimize for size, as well as a library dir I use. I used this successfully to compile arduino software, I also previously hacked the PdePreprocessor in the arduino editor to be run from the command line to generate all the voodoo:

    https://github.com/wesen/mididuino/blob/master/app/src/processing/app/preproc/PdePreprocessor.java

    #
    # generic AVR makefile
    #
    # (c)  July 2011 - Manuel Odendahl - wesen@ruinwesen.com
    #
    
    # include this into your main Makefile, after having defined TARGET and TARGET_OBJS
    
    all: $(TARGET).hex
    
    CURDIR := $(dir $(lastword $(MAKEFILE_LIST)))
    include $(CURDIR)MidiCtrl.mk
    
    CC             = avr-gcc
    CXX            = avr-g++
    OBJCOPY        = avr-objcopy
    AVR_ARCH       ?= atmega64
    LDAVR_ARCH     ?= avrmega64
    FLASH_PROTOCOL = jtag2
    
    CFLAGS   += -Os -ffunction-sections -DAVR -I. -mmcu=$(AVR_ARCH) -mcall-prologues -fshort-enums -fpack-struct -Wall -Werror
    CFLAGS   += -Wall -DLITTLE_ENDIAN -g -flto
    
    CFLAGS += no-tree-loop-optimize -ffreestanding -morder1 -funsigned-char -funsigned-bitfields -fshort-enums -fpack-struct
    CFLAGS += -fdata-sections -fno-split-wide-types -fno-inline-small-functions -mcall-prologues
    
    CLDFLAGS += -Wl,--relax,--gc-sections -ffunction-sections
    CLDFLAGS += -mmcu=$(AVR_ARCH)
    LDFLAGS  = -m $(LDAVR_ARCH) -M
    
    # generate list
    # CFLAGS += -Wa,-adhlns=$@.lst
    
    %.o: %.cpp
            $(CXX) $(CXXFLAGS) -c $< -o $@
    
    %.o: %.c
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.o: %.s
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.s: %.c
            $(CC) -S $(CFLAGS) -fverbose-asm $< -o $@
    
    %.o: %.S
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.syx: %.hex
            ihex2sysex $< $@
    
    %.srec: %.elf
            $(OBJCOPY) -j .text -j .data -O srec $< $@
    
    %.hex: %.elf
            $(OBJCOPY) -j .text -j .data -O ihex $< $@
    
    %.ee_srec: %.elf
            $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
    
    AVR_BASE_DIR  ?= $(abspath $(CURDIR)..)
    AVR_LIB_DIR   ?= $(AVR_BASE_DIR)/hardware/libraries
    
    AVR_LIBS       += CommonTools Midi
    AVR_LIB_DIRS   += $(foreach lib,$(AVR_LIBS),$(AVR_LIB_DIR)/$(lib))
    AVR_INC_FLAGS  += $(foreach dir,$(AVR_LIB_DIRS),-I$(dir))
    AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(wildcard $(dir)/*.cpp),$(subst .cpp,.o,$(file))))
    AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(filter-out $(AVR_HOST_EXCLUDE),$(wildcard $(dir)/*.c)),$(subst .c,.o,$(file))))
    AVR_DEPS       += $(subst .o,.d,$(AVR_OBJS))
    
    # AVR_HOST_EXCLUDE can be used to exclude specific files later on
    
    CXXFLAGS += $(AVR_INC_FLAGS)
    CFLAGS += $(AVR_INC_FLAGS)
    
    CXXFlags += -Werror -Wall
    CFLAGS += -Werror -Wall
    
    default: all
    
    %.d:%.c
            set -e; $(CC) -MM $(CFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.d:%.cpp
            set -e; $(CXX) -MM $(CXXFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.host.d:%.c
            set -e; $(CC) -MM $(CFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.host.d:%.cpp
            set -e; $(CXX) -MM $(CXXFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    printlibs:
            echo $(AVR_LIBS)
    
    $(TARGET).elf: $(TARGET).o $(TARGET_OBJS) $(AVR_OBJS)
            $(CXX) $(CLDFLAGS) -g -o $@ $^
    
    _clean:
            - rm *.elf *.hex *.o .midictrl.flags
    
    libclean:
            rm -rf $(TARGET_OBJS) $(OBJS)
    
    # concrete settings for development environment
    
    UNAME=$(shell uname)
    ISWIN=$(findstring CYGWIN,$(UNAME))
    ISMAC=$(findstring Darwin,$(UNAME))
    
    CC = avr-gcc
    CXX = avr-g++
    OBJCOPY = avr-objcopy
    AVR_ARCH = atmega64
    F_CPU = 16000000L
    CORE = minicommand2
    
    0 讨论(0)
  • 2020-12-13 18:19

    Compiling and uploading sketches (as apposed to C/C++ sources) on the command line (on Windows, Mac, and Linux) is supported directly via flags to the arduino executable since 1.5.0.

    An ino can be compiled and uploaded with arduino --upload [sketch.ino]

    Documentation

    0 讨论(0)
  • 2020-12-13 18:22

    You can use biicode (it's a project I'm working in) which is based on CMake (but you don't actually need to write any cmake file) and is also a tool to manage Arduino libraries

    It's main features are:

    • Dependencies resolution, transitively, as maven does, but without config files: reads dependencies directly from source code.
    • Central repository, anyone can upload their libraries. They can be explored, navigated and discovered in the web
    • Version control: it checks versions compatibility and allows safe updates of dependencies
    • You can use it with any text editor (it has optional eclipse integration)
    • It manages project setup and compilations, flashes generated firmware to the board

    You can see a quick demo here and read more in the documentation.

    0 讨论(0)
  • 2020-12-13 18:23

    Official CLI tool

    The arduino team is developing a cli client https://github.com/arduino/arduino-cli

    Announcement: https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

    You can do almost everything with this, from downloading boards and libraries, to compile and upload scripts. What's missing is the monitoring part.

    To monitor in linux you can still use the commands stty to configure port and cat to read it.

    stty -F /dev/ttyACM0 38400 # <-- Baud rate. The number in Serial.begin()
    cat /dev/ttyACM0 # <-- Port
    

    You can find the port with arduino-cli

    arduino-cli board list
    

    Full instructions in the Github repo and the man page:

        $ arduino-cli Arduino Command Line Interface (arduino-cli).
    
        Usage:   arduino-cli [command]
    
        Examples: arduino <command> [flags...]
    
        Available Commands:
          board         Arduino board commands.
          compile       Compiles Arduino sketches.
          config        Arduino Configuration Commands.
          core          Arduino Core operations.
          help          Help about any command
          lib           Arduino commands about libraries.
          sketch        Arduino CLI Sketch Commands.
          upload        Upload Arduino sketches.
          version       Shows version number of Arduino CLI.
    
    0 讨论(0)
提交回复
热议问题