DuinOS: small and simple rtos

Using Make and the DuinOS

I've made a makefile (based on a makefile from a post in another thread) that builds DuinOS and your sketch. This makefile builds the sketch that was posted in the very beginning of the thread. The makefile assumes that the sketch is DuinOSTest.pde. Note, this is from a MAC, but it should be easy to modify for linux or even windows

TARGET = $(notdir $(CURDIR))
#INSTALL_DIR = $(HOME)/arduino-0018

This is the location on the MAC

INSTALL_DIR = /Applications/Arduino.app/Contents/Resources/Java

Serial port which I always connect my MEGA to

PORT = /dev/tty.usbserial-A900ceXD
UPLOAD_RATE = 57600
AVRDUDE_PROGRAMMER = stk500v1
#MCU = atmega168

Processor for the Arduino Mega

MCU = atmega1280
F_CPU = 16000000

############################################################################

Below here nothing should be changed...

VERSION=18

Location of the boards file

ARDUINO = $(INSTALL_DIR)/hardware/arduino/cores/arduino.DuinOS
AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
#AVR_TOOLS_PATH = /usr/local/CrossPack-AVR-20100115/bin
#AVR_TOOLS_PATH = /usr/bin
#AVRDUDE_PATH = $(INSTALL_DIR)/hardware/tools
AVRDUDE_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
#These are all the C language files for Arduino and the DuinOS
C_MODULES =
$(ARDUINO)/wiring_pulse.c
$(ARDUINO)/wiring_analog.c
$(ARDUINO)/pins_arduino.c
$(ARDUINO)/wiring.c
$(ARDUINO)/wiring_digital.c
$(ARDUINO)/WInterrupts.c
$(ARDUINO)/wiring_shift.c
$(ARDUINO)/DuinOS/croutine.c
$(ARDUINO)/DuinOS/heap_1.c
$(ARDUINO)/DuinOS/heap_2.c
$(ARDUINO)/DuinOS/heap_3.c
$(ARDUINO)/DuinOS/list.c
$(ARDUINO)/DuinOS/port.c
$(ARDUINO)/DuinOS/queue.c
$(ARDUINO)/DuinOS/tasks.c \

end of C_MODULES

#These are all the CPP language files for Arduino and the DuinOS
CXX_MODULES =
$(ARDUINO)/Tone.cpp
$(ARDUINO)/main.cpp
$(ARDUINO)/WMath.cpp
$(ARDUINO)/Print.cpp
$(ARDUINO)/HardwareSerial.cpp \

end of CXX_MODULES

Variable for where my sketches are kept

SKETCHHOME=/Users/sbade1/Documents/Arduino

#Vpath simplifies MAKE finding source files

VPATH = ../libraries/SdFat:../libraries/SoftI2cMaster:../libraries/TwiMaster:../libraries/TinyGPS:$(ARDUINO):$(ARDUINO)/DuinOS

CXX_APP = applet/$(TARGET).cpp

Additional CPP files - library files would be specified here

CXXFILES =

MODULES = $(C_MODULES) $(CXX_MODULES) $(CXXFILES)
SRC = $(C_MODULES) $(CXXFILES)
CXXSRC = $(CXX_MODULES) $(CXX_APP) $(CXXFILES)
FORMAT = ihex

Name of this Makefile (used for "make depend").

MAKEFILE = Makefile

Debugging format.

Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.

AVR (extended) COFF requires stabs, plus an avr-objcopy run.

#DEBUG = stabs
DEBUG =

OPT = s

Place -D or -U options here

CDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)
CXXDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)

Place -I options here

Local includes for the project

CINCSLOCAL = -I$(ARDUINO) -Ipwd -I$(ARDUINO) -I$(ARDUINO)/DuinOS

CINCS = -I$(ARDUINO) -Ipwd $(CINCSLOCAL)
CXXINCS = -I$(ARDUINO) -Ipwd $(CINCSLOCAL)

Compiler flag to set the C Standard level.

c89 - "ANSI" C

gnu89 - c89 plus GCC extensions

c99 - ISO C99 standard (not yet fully implemented)

gnu99 - c99 plus GCC extensions

#CSTANDARD = -std=gnu99
CDEBUG = -g$(DEBUG)
#CWARN = -Wall -Wstrict-prototypes
#CWARN = -Wall # show all warnings
CWARN = -w # suppress all warnings
####CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CTUNING = -ffunction-sections -fdata-sections
CXXTUNING = -fno-exceptions -ffunction-sections -fdata-sections
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)

CFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CTUNING) $(CDEFS) $(CINCS) $(CSTANDARD) $(CEXTRA)
CXXFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CXXTUNING) $(CDEFS) $(CINCS)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
LDFLAGS = -O$(OPT) -lm -Wl,--gc-sections

Programming support using avrdude. Settings and variables.

AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex

#AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf \

AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-b $(UPLOAD_RATE)

Program settings

CC = $(AVR_TOOLS_PATH)/avr-gcc
CXX = $(AVR_TOOLS_PATH)/avr-g++
LD = $(AVR_TOOLS_PATH)/avr-gcc
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
AR = $(AVR_TOOLS_PATH)/avr-ar
SIZE = $(AVR_TOOLS_PATH)/avr-size
NM = $(AVR_TOOLS_PATH)/avr-nm
AVRDUDE = $(AVRDUDE_PATH)/avrdude
REMOVE = rm -f
MV = mv -f

Define all object files.

OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) $(CXXFILES:.cpp=.o)
OBJ_MODULES = $(C_MODULES:.c=.o) $(CXX_MODULES:.cpp=.o) $(CXXFILES:.cpp=.o)

Define all listing files.

LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)

Combine all necessary flags and optional flags.

Add target processor to flags.

ALL_CFLAGS = $(CFLAGS) -mmcu=$(MCU)
ALL_CXXFLAGS = $(CXXFLAGS) -mmcu=$(MCU)
ALL_ASFLAGS = -x assembler-with-cpp $(ASFLAGS) -mmcu=$(MCU)
ALL_LDFLAGS = $(LDFLAGS) -mmcu=$(MCU)

Default target.

all: applet_files build sizeafter

build: elf hex

#applet_files: $(TARGET).pde
applet/$(TARGET).cpp: $(TARGET).pde

Here is the "preprocessing".

It creates a .cpp file based with the same name as the .pde file.

On top of the new .cpp file comes the WProgram.h header.

and prototypes for setup() and Loop()

Then the .cpp file will be compiled. Errors during compile will

refer to this new, automatically generated, file.

Not the original .pde file you actually edit...

test -d applet || mkdir applet
echo '#include "WProgram.h"' > applet/$(TARGET).cpp
echo 'void setup();' >> applet/$(TARGET).cpp
echo 'void loop();' >> applet/$(TARGET).cpp
cat $(TARGET).pde >> applet/$(TARGET).cpp

elf: applet/$(TARGET).elf
hex: applet/$(TARGET).hex
eep: applet/$(TARGET).eep
lss: applet/$(TARGET).lss
sym: applet/$(TARGET).sym

foo:
echo $(LST)

Program the device.

upload: applet/$(TARGET).hex
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)

Display size of file.

HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
ELFSIZE = $(SIZE) applet/$(TARGET).elf
sizebefore:
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi

sizeafter:
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi

Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.

COFFCONVERT=$(OBJCOPY) --debugging
--change-section-address .data-0x800000
--change-section-address .bss-0x800000
--change-section-address .noinit-0x800000
--change-section-address .eeprom-0x810000

coff: applet/$(TARGET).elf
$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof

extcoff: $(TARGET).elf
$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof

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

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

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

Create extended listing file from ELF output file.

.elf.lss:
$(OBJDUMP) -h -S $< > $@

Create a symbol table from ELF output file.

.elf.sym:
$(NM) -n $< > $@

Link: create ELF output file from library.

#applet/$(TARGET).elf: $(TARGET).pde applet/core.a
applet/$(TARGET).elf: applet/$(TARGET).o applet/core.a
$(LD) $(ALL_LDFLAGS) -o $@ applet/$(TARGET).o applet/core.a

applet/core.a: $(OBJ_MODULES)
@for i in $(OBJ_MODULES); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done

Compile: create object files from C++ source files.

.cpp.o:
$(CXX) -c $(ALL_CXXFLAGS) $< -o $@

Compile: create object files from C source files.

.c.o:
$(CC) -c $(ALL_CFLAGS) $< -o $@

Compile: create assembler files from C source files.

.c.s:
$(CC) -S $(ALL_CFLAGS) $< -o $@

Assemble: create object files from assembler source files.

.S.o:
$(CC) -c $(ALL_ASFLAG