Linux 命令行Arduino编译和上载?

Linux 命令行Arduino编译和上载?,linux,macos,command-line,arduino,Linux,Macos,Command Line,Arduino,如何在Mac和Linux上从命令行编译和上传Arduino?我已经安装了Arduino编程环境。任何地方都有一些示例makefiles吗?如果可以使用cmake,那么在同一个web中会有一些链接(例如)。GNU makefile与cmake略有不同,但并不复杂。只要谷歌一下,你就可以找到很多关于如何编译AVR代码的Makefile示例。你需要用arduino草图创建一个可行的cpp文件。arduino环境会自动为您实现这一点。获取这些文件的一个技巧是打开你的arduino preferences

如何在Mac和Linux上从命令行编译和上传Arduino?我已经安装了Arduino编程环境。任何地方都有一些示例makefiles吗?

如果可以使用cmake,那么在同一个web中会有一些链接(例如)。GNU makefile与cmake略有不同,但并不复杂。只要谷歌一下,你就可以找到很多关于如何编译AVR代码的Makefile示例。

你需要用arduino草图创建一个可行的cpp文件。arduino环境会自动为您实现这一点。获取这些文件的一个技巧是打开你的arduino preferences.txt(它在mac上的~/Library/arduino中,我想在你的文档和设置或windows上的应用程序数据中,记不清了),然后设置build.verbose=true和upload.verbose=true。启动arduino,编译草图(不要上传)。底部的控制台将显示编译了哪些文件。现在可以转到该目录,该目录将包含cpp文件和所有核心arduino对象的编译对象文件。您可以将它们复制到项目中,并使用cpp文件进行进一步的黑客攻击。如果您需要有关Makefile的更多信息,请告诉我,我可以向您提供我所拥有的信息。

您可以实际使用arduino GUI编译和上载,并在首选项中将编辑器设置为external。这样,你就可以从XCODE编辑C++(PDE)文件,并让ARDUNO生成实际的CPP并构建整个SeBug。 您还可以使用XCode为arduino编写简单的C++/C,使用avr gcc编译器

看看:

然后,您可以使用普通的avrdude上传工具对arduino进行编程。看看:


过去,Arduino所说的协议是STK500协议的修改,只有与Arduino捆绑在一起的avrdude才能说。我不知道主流的avrdude是否已经升级,或者您是否仍然需要求助于Arduino文件夹中的avrdude。

这是我的样板gnu make include for AVR项目,您可能需要调整其中一些以适应您的环境。它创建了依赖项,有一系列我觉得有用的标准gcc选项,或者针对大小进行了优化,还有一个我使用的库目录。我用它成功地编译了arduino软件,我之前也在arduino编辑器中入侵了PDEProcessor,从命令行运行,以生成所有伏都教:

#
#通用AVR生成文件
#
#(c)2011年7月-Manuel Odendahl-wesen@ruinwesen.com
#
#在定义了TARGET和TARGET_OBJS之后,将其包含到主Makefile中
全部:$(目标).hex
CURDIR:=$(dir$(lastword$(MAKEFILE_LIST)))
包括$(CURDIR)midctrl.mk
CC=avr gcc
CXX=avr-g++
OBJCOPY=avr OBJCOPY
AVR_ARCH?=atmega64
LDAVR_ARCH?=avrmega64
FLASH_协议=jtag2
CFLAGS+=-Os-fffunction sections-DAVR-I.-mmcu=$(AVR_ARCH)-mcall序言-fshort enums-fpack struct-Wall-Werror
CFLAGS+=-Wall-DLITTLE_ENDIAN-g-flto
CFLAGS+=无树循环优化-ffreestanding-morder1-funsigned char-funsigned bitfields-fshort enums-fpack struct
CFLAGS+=-fdata节-fno拆分宽类型-fno内联小函数-mcall序言
CLDFLAGS+=-Wl,--relax,--gc部分-功能部分
CLDFLAGS+=-mmcu=$(平均值)
LDFLAGS=-m$(LDAVR_ARCH)-m
#生成列表
#CFLAGS+=-Wa,-adhlns=$@.lst
%.o:%.cpp
$(CXX)$(CXXFLAGS)-c$<-o$@
%.o:%.c
$(CC)$(CFLAGS)-c$<-o$@
%.o:%.s
$(CC)$(CFLAGS)-c$<-o$@
%.s:%
$(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--更改节lma.eeprom=0-O srec$<$@
AVR_BASE_DIR?=$(abspath$(CURDIR)…)
AVR_LIB_DIR?=$(AVR_BASE_DIR)/硬件/库
AVR_LIBS+=通用工具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文件,$(通配符$(dir)/*.cpp),$(subst.cpp,.o,$(文件)))
AVR_OBJS+=$(foreach dir,$(AVR_LIB_DIRS),$(foreach文件,$(过滤掉$(AVR_HOST_排除),$(通配符$(dir)/*.c)),$(subst.c,.o,$(文件)))
AVR_DEPS+=$(子对象、.d、$(AVR_对象))
#AVR_HOST_EXCLUDE可用于以后排除特定文件
CXXFLAGS+=$(AVR\U INC\U标志)
CFLAGS+=$(AVR_公司标志)
CXXFlags+=-Werror-Wall
CFLAGS+=-Werror-Wall
默认值:全部
%d.d:%
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$@
%.主持人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$@
打印库:
echo$(平均自由行)
$(TARGET.elf:$(TARGET.o$(TARGET_OBJS)$(AVR_OBJS)
$(CXX)$(CLDFLAGS)-g-o$@$^
_清洁:
-rm*.elf*.hex*.o.midictrl.flags
libclean:
rm-rf$(目标对象)$(对象对象)
#发展环境的具体环境
UNAME=$(shell UNAME)
ISWIN=$(查找字符串CYGWIN,$(UNAME))
ISMAC=$(findstring Darwin,$(UNAME))
CC=avr gcc
CXX=avr-g++
OBJCOPY=avr OBJCOPY
AVR_ARCH=atmega64
F_CPU=1600000L
核心=小型命令2

有一个名为的命令行Arduino工具包。它就是这样做的。

如果你不坚持制作,那么也会有SCON/sconstruct。因为这基本上是用Python编写的,所以调整要比制作简单得多。此外,它还可以
#
# 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
arduino-cli board list
function th(){
    if [ "${1}" = "upload" ];then
    if [ ! -f platformio.ini ]; then
        echo platformio.ini not found
    else 
        UPLOAD_PORT=`cat platformio.ini | grep upload_port | awk '{print $3}'`
        if [ "${UPLOAD_PORT}" = "" ]; then
            echo no upload port
        else
            if [ "${2}" != "" ]; then
                FIRMWARE=${2}
            else
#the firmware location seems to have moved
#               FIRMWARE='.pioenvs/megaatmega2560/firmware.hex'
                FIRMWARE='.pio/build/megaatmega2560/firmware.hex'
            fi
            if [ -f "${FIRMWARE}" ]; then
                avrdude -v -p atmega2560 -C /home/stevenk/.platformio/packages/tool-avrdude/avrdude.conf -c wiring -b 115200 -D -P "${UPLOAD_PORT}" -U flash:w:$FIRMWARE:i
            else
                echo ${FIRMWARE} not found
            fi
        fi
    fi
    else 
            wget --timeout 8 -qO- http://192.168.178.212/$1
    fi
}