Pages: [1]   Go Down
Author Topic: command line development in linux  (Read 1246 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

I was just wondering if there's a list of commands somewhere that the IDE runs when uploading a program to the board. It would be great to automate all that from the command line. It would be cool if the IDE printed what it was executing in some window.

Thanks for any ideas.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 610
Posts: 49077
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
It would be cool if the IDE printed what it was executing in some window.
Use File + Preferences, turn on verbose output, and it will.
Logged

0
Offline Offline
God Member
*****
Karma: 39
Posts: 988
Get Bitlash: http://bitlash.net
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Search the forum for "makefile" and you'll find related projects.

-br
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

That's so cool, thanks!

So, I could replace the parts that are variable in those commands and create a script? Hasn't somebody done it already? I just specify the port and voila?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
it seems that this issue is addressed in the latest IDE 1.5.1 beta.
Check this out https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-from-command-line

I have tried it and it works. The only complain that I have is that invoking from command line also starts the GUI for the time of the execution.

Best regards,
Dan.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Very nice. Thanks for the post. I meanwhile created a Makefile for this myself. Which was a nice learning experience in itself. But I'm glad it's standard now. Thanks!!!

If anybody is interested in the Makefile, let me know.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
I am interested in it. Does it work with the latest Arduino IDE 1.5.1? Does it support the sam architecture (as used with the Due boards) ?

Best regards,
Dan.

P.S.
You might be interested in following this issue too
http://code.google.com/p/arduino/issues/detail?id=124
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Will post tonight -- it's at home.

Quote
Does it support the sam architecture (as used with the Due boards) ?

If the IDE can do it, you can probably modify the Makefile to do it as well. I know nothing about the Due board though.

Back later...
Logged

Denmark
Offline Offline
Edison Member
*
Karma: 35
Posts: 1063
Happy Hobbyist
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduino.cc/forum/index.php/topic,83725.0.html
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here's my Makefile. Well, not quite. I took a Makefile here (http://playground.arduino.cc/uploads/Learning/Makefile) but I didn't work for me. So I made the necessary adjustments. Your code will have to have the following "extras":

1)
include "Arduino.h"
include "Servo.c" // or any other library

2) function prototypes for all functions in your program.

Example:

Code:
#include "Arduino.h"
void setup();
void loop();

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
}

Code:
PREFIX = PATH_TO_YOUR_ARDUINO_IDE_DIR
PORT = /dev/ttyACM0
# your program name minus the .cpp extension.
TARGET = YOUR_PROGRAM_NAME
ARDUINO = $(PREFIX)/hardware/arduino/cores/arduino
ARDUINO_LIBS = $(PREFIX)/libraries
ARDUINO_INCL = $(PREFIX)/hardware/arduino/variants/standard $(wildcard $(ARDUINO_LIBS)/*)
ARDUINO_BIN = $PREFIX/hardware/tools/avr/bin
ARDUINO_TOOLS = $PREFIX/hardware/tools

VPATH=$(ARDUINO)

SRC = $(wildcard $(ARDUINO)/*.c)

# I had to include the Servo.cpp explicitly. If you use another library in addition, mention it here as well.
CXXSRC = $(TARGET).cpp $(wildcard $(ARDUINO)/*.cpp) $(ARDUINO_LIBS)/Servo/Servo.cpp

MCU = atmega328p
F_CPU = 16000000
FORMAT = ihex
UPLOAD_RATE = 19200

# Place -D or -U options here
CDEFS = -DF_CPU=$(F_CPU)
CXXDEFS = -DF_CPU=$(F_CPU)

# Place -I options here
CINCS = -I$(ARDUINO) $(foreach d, $(ARDUINO_INCL), -I$d)
CXXINCS = -I$(ARDUINO) $(foreach d, $(ARDUINO_INCL), -I$d)

CSTANDARD =
CDEBUG = -g$(DEBUG)
CWARN = -Wall
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CEXTRA = -Os -ffunction-sections -fdata-sections
CXXEXTRA = -Os -fno-exceptions -ffunction-sections -fdata-sections

CFLAGS = $(CDEFS) $(CINCS) -Os $(CWARN) $(CSTANDARD) $(CEXTRA)
CXXFLAGS = $(CDEFS) $(CINCS) $(CXXEXTRA)

# Programming support using avrdude. Settings and variables.
AVRDUDE_PROGRAMMER = arduino
AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex:i
AVRDUDE_FLAGS = -p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) -b $(UPLOAD_RATE) -D $(AVRDUDE_WRITE_FLASH)

# Program settings
CC = $(ARDUINO_BIN)/avr-gcc
CXX = $(ARDUINO_BIN)/avr-g++
OBJCOPY = $(ARDUINO_BIN)/avr-objcopy
OBJDUMP = $(ARDUINO_BIN)/avr-objdump
SIZE = $(ARDUINO_BIN)/avr-size
NM = $(ARDUINO_BIN)/avr-nm
AVRDUDE = $(ARDUINO_TOOLS)/avrdude
REMOVE = rm -f
MV = mv -f

# Define all object files.
OBJ = $(SRC:.c=.c.o) $(CXXSRC:.cpp=.cpp.o) $(ASRC:.S=.o)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS)

# Default target. Remove core.a before doing anything.
all: remove_core build

build: elf hex eep

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep

#$(AVRDUDE) -C$(ARDUINO_TOOLS)/avrdude.conf $(AVRDUDE_FLAGS)
# Program the device. 
upload: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) -C$(ARDUINO_TOOLS)/avrdude.conf -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:$(TARGET).hex:i

.SUFFIXES: .elf .hex .eep .lss .sym

.elf.hex:
$(OBJCOPY) -O $(FORMAT) -R .eeprom $(TARGET).elf $(TARGET).hex

.elf.eep:
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 -O $(FORMAT) $< $@

core: $(OBJ)
$(ARDUINO_BIN)/avr-ar rcs core.a $?

# Link: create ELF output file from object files.
$(TARGET).elf: core
$(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(TARGET).elf core.a -lm

# Compile: create object files from C++ source files.
%.cpp.o: %.cpp
$(CXX) -c $(ALL_CFLAGS) $< -o $@

# Compile: create object files from C source files.
%.c.o: %.c
$(CC) -c $(ALL_CXXFLAGS) $< -o $@

# Target: clean project.
clean:
$(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) \
core.a

remove_core:
$(REMOVE) core.a

.PHONY: all build elf hex eep lss sym program clean remove_core
« Last Edit: January 24, 2013, 10:44:53 pm by serg_ge » Logged

Pages: [1]   Go Up
Jump to: