Die Systick Library ermöglichst es, einige Funktionen quasi im Hintergrund zu verarbeiten. Nach einer vorgegebenen Zeit (z.B. 10ms) wird ein Interrupt ausgelöst und die IRQ Routine verarbeitet die gewählten Hintergrundprozesse. Derzeit sind drei Hintergrundprozesse implementiert. SysLED, SysSwitch und SysADC. SysTimer befindet sich in der Planung.
Der SysTick ist so implementiert, das er auf allen AVR mit Timer0 oder Timer2 funktioniert.
SysLED kann bis zu 8 LEDs verwalten. Diese LEDs müssen sich auf dem gleichen Port befinden. Man kann die LEDs ein- und ausschalten oder mit einer vorgegebenen Frequenz blinken lassen. Dabei besteht die Möglichkeit, der Polarität der LEDs zu berücksichtigen, also ob sie bei einem High Pegel am Port Leuchten oder bei einem Low Pegel. Der Befehl sysled_on schaltet die LED dabei immer ein, unabhängig wie sie angeschlossen ist.
SysSwitch kann bis zu 8 Taster verwalten. Alle Taster müssen sich auf dem gleichen Port befinden. Die Implementierung berücksichtigt die Möglichkeit, den internen PullUp Widerstand zu aktivieren. Außerdem kann für jeden Taster festgelegt werden, ob er Aktive-High oder Aktive-Low arbeitet. Alle Taster werden per Software entprellt.
SysADC kann derzeit bis zu 8 analoge Kanäle auswerten. Hierbei wird im Takt des Systick die Wandlung gestartet. Der ADC wandelt dann automatisch im Hintergrund alle eingestellten Kanäle und speichert die Werte in ein Array. SysADC unterstützt derzeit nur ADC mit maximal 8 Kanälen.
SysTimer soll bis zu 8 Timer enthalten. Mit diesen Timern sollen vor allem längere Delays von mehreren Sekunden oder Minuten realisiert werden können.
Ohne die Verwendung eines der Module hat SysTick keine Funktion.
In der config.h sind folgende Zeilen anzupassen
/*------------------------------------------------------------------------------ * Defines for Systick *----------------------------------------------------------------------------*/ #define USE_TIMER 0 // use Timer0 for Systick (2 for Timer2) #define SYSTICK 10 // define Systick in ms
Verwendet man das Makefile muss die Datei systick.c in die Liste der Source Files eingetragen werden
# List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c SRC += $(Ext_lib_path)systick.c
Bevorzugt man Scons muss die Datei systick.c in der Variable src eingefügt werden
# Add all additional source files to compile src=""" obj/systick.c """
SysTick hat nur eine Funktion.
void systick_init(void);
Die Funktion systick_init() initialisiert den SysTick. systick_init() ruft dabei automatisch alle Init Funktionen der zugeordneten Module auf.
Das folgende Beispiel demonstriert die Funktion von SysTick, SysLED, SysSwitch und SysADC.
/*------------------------------------------------------------------------------ * Copyright 1994-2008 The FreeBSD Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *----------------------------------------------------------------------------*/ #include <config.h> #include <stdlib.h> #include <stdio.h> #include <string.h> /* Define a constant char in the Flash */ const char HelloFlash[] PROGMEM = "Hello World!"; int main(void) { char Adc_s[10]; usart0_init(); /* Init USART */ systick_init(); /* Init Systick */ adc_start(); /* Start Conversion */ sei(); /* Enable Interrupt */ while(!Button); /* Wait until Button is pressed */ sysled_on(0); /* Turn LED on */ while(Button); /* Wait until Button is released */ sysled_off(0); /* Turn LED off */ while(!Button); /* Wait until Button is pressed */ sysled_flash(0); /* Enable Flashing for LED */ while(Button); /* Wait until Button is released */ writeln_p(usart0_putc, HelloFlash); /* Send a String from the Flash through the USART */ for (;;) /* loop forever */ { if (usart0_data_received()) /* If Data in Buffer then */ usart0_putc(usart0_getc()); /* Echo chat to the UART */ if (Button) /* If Button is pressed */ { sprintf(Adc_s, "%ld", adc_get(0)); /* Get ADC0 and convert to String */ writeln(usart0_putc, Adc_s); /* Output String to USART */ while(Button); /* wait until Button released */ } ; } }
Das Programm initialisiert den USART, den SysTick und startet den AD-Wandler. Anschließend wartet es, bis der Taster gedrückt wurde. Sobald der Taster gedrückt wird beginnt die LED zu leuchten, bis der Taster losgelassen wird. Drückt man den Taster erneut beginnt die LED zu blinken und das Programm wartet erneut, bis der Taster losgelassen wird. Anschließend sendet der USART den Text „Hello World“.
In der Schleife wird abgefragt, ob der USART ein Zeichen empfangen hat. Befindet sich ein Zeichen im Buffer wird es gelesen und direkt als Echo zurück gesendet.
Wird der Button gedrückt, ließt das Programm den aktuellen Messwert des ADC und wandelt ihn in einen String um. Dieser String wird über den USART gesendet. Anschließend wird gewartet, bis der Button losgelassen wurde.
#ifndef CONFIG_H #define CONFIG_H /*------------------------------------------------------------------------------ * Copyright 1994-2008 The FreeBSD Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *----------------------------------------------------------------------------*/ #include <avr/io.h> #include <utils.h> /*------------------------------------------------------------------------------ * Defines for USART0 *----------------------------------------------------------------------------*/ #define BAUD 9600 // define Baud Rate #define USART0_RX_BUFFER_SIZE 32 // define Receive Buffer Size. Size can be 2, 4, 8, 16, 32, 64, 128 or 256 Byte #define USART0_TX_BUFFER_SIZE 32 // define Transmit Buffer Size. Size can be 2, 4, 8, 16, 32, 64, 128 or 256 Byte /*------------------------------------------------------------------------------ * Defines for Systick *----------------------------------------------------------------------------*/ #define USE_TIMER 0 // use Timer0 for Systick (2 for Timer2) #define SYSTICK 10 // define Systick in ms /*------------------------------------------------------------------------------ * Defines for SysLED *----------------------------------------------------------------------------*/ #define SYSTICK_SYSLED // uncomment this line to use SysLED #define SYSLED_PORT PORTB // Port Register of the SysLED Port #define NO_SYSLED 1 // Number of SysLEDs #define FIRST_SYSLED PB0 // First SysLED on the port #define SYSLED_LOGIC 0b00000001 // 1=positive logic, 0=negative logic #define SYSLED_RATE 100 // Flash rate in Systicks /*------------------------------------------------------------------------------ * Defines for SysSwitch *----------------------------------------------------------------------------*/ #define SYSTICK_SYSSWITCH // uncomment this line to use SysSwitch #define SYSSWITCH_PORT PORTB // Port Register of SysSwitch Port #define NO_SYSSWITCH 1 // Number of SysSwitches #define FIRST_SYSSWITCH PB1 // First SysSwitch in the port #define SYSSWITCH_LOGIC 0b00000000 // 1=positive logic, 0=negative logic #define SYSSWITCH_PULLUP 0b00000010 // 1=Turn on internal PuuUp Resistor #define SYSSWITCH_DEBOUNCE 3 // Number of Systicks to debounce /*------------------------------------------------------------------------------ * Defines for SysADC *----------------------------------------------------------------------------*/ #define SYSTICK_ADC // uncomment this line to use SysADC #define FIRST_ADC_CHAN ADC0 // First used ADC Channel #define NO_ADC_CHANS 1 // Number of ADC Channels used in Application #define ADC_PRESC ADC_PRESC_64 // Define analog prescaler value #define ADC_REF ADC_REF_INT // Define analog reference value /*------------------------------------------------------------------------------ * Defines for Utils *----------------------------------------------------------------------------*/ // Don't remove #include <sysswitch.h> // SysSwitch must be included here. /*----------------------------------- * LINE_END defines the Line Ending for writeln() and writeln_p() * 0=UNIX='\n' * 1=MAC='\r' * 2=WIN='\r\n' *----------------------------------*/ #define LINE_END 2 /*----------------------------------- * Define your IO here * Examples for LED at PORTD.0 and switch at PIND.1 * #define LED1 BIT(PORTD, 0) * #define SWITCH1 BIT(PIND, 1) *----------------------------------*/ #define Button BIT(SysSwitchPort,1) // define a Button on SysSwitchPort /*------------------------------------------------------------------------------ * Generic Defines and Includes * Don't touch *----------------------------------------------------------------------------*/ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #include <systick.h> #include <sysled.h> #include <sysadc.h> #include <usart.h> #endif
# Hey Emacs, this is a -*- makefile -*- # # WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al. # Released to the Public Domain # Please read the make user manual! # # Additional material for this makefile was submitted by: # Tim Henigan # Peter Fleury # Reiner Patommel # Sander Pool # Frederik Rouleau # Markus Pfaff # # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). # # make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio # 4.07 or greater). # # make program = Download the hex file to the device, using avrdude. Please # customize the avrdude settings below first! # # make filename.s = Just compile filename.c into the assembler code only # # To rebuild project do "make clean" then "make all". # # mth 2004/09 # Differences from WinAVR 20040720 sample: # - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum) # - F_CPU Define in CFLAGS and AFLAGS # MCU name MCU = atmega32 # Main Oscillator Frequency # This is only used to define F_CPU in all assembler and c-sources. F_CPU = 16000000UL # Path to external Source Files Ext_lib_path= ../../EP-gcc-lib/ # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = main # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c SRC += $(Ext_lib_path)usart.c SRC += $(Ext_lib_path)utils.c SRC += $(Ext_lib_path)systick.c SRC += $(Ext_lib_path)sysled.c SRC += $(Ext_lib_path)sysswitch.c SRC += $(Ext_lib_path)sysadc.c # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # 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 = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. EXTRAINCDIRS = . $(Ext_lib_path) # 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 # Place -D or -U options here CDEFS = # Place -I options here CINCS = # Compiler flags. # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums CFLAGS += -Wall -Wstrict-prototypes CFLAGS += -Wa,-adhlns=$(<:.c=.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) CFLAGS += -DF_CPU=$(F_CPU) CFLAGS += -Werror # Assembler flags. # -Wa,...: tell GCC to pass this to the assembler. # -ahlms: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs ASFLAGS += -DF_CPU=$(F_CPU) #Additional libraries. # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt PRINTF_LIB = # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt SCANF_LIB = MATH_LIB = -lm # External memory options # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = # Linker flags. # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # Programming support using avrdude. Settings and variables. # Programming hardware: alf avr910 avrisp bascom bsd # dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 # # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = avrisp2 # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb # programmer connected to serial device AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) # --------------------------------------------------------------------------- # Define directories, if needed. DIRAVR = c:/winavr DIRAVRBIN = $(DIRAVR)/bin DIRAVRUTILS = $(DIRAVR)/utils/bin DIRINC = . DIRLIB = $(DIRAVR)/avr/lib # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f COPY = cp # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: # Define all object files. OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) # Define all listing files. LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) # Compiler flags to generate dependency files. ### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter finished end build: elf hex eep lss sym elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) finished: @echo $(MSG_ERRORS_NONE) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf sizebefore: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi sizeafter: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) # 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: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) # Compile: create object files from C source files. %.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Assemble: create object files from assembler source files. %.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list finished end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).a90 $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lnk $(REMOVE) $(TARGET).lss $(REMOVE) $(OBJ) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) .dep/* # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff \ clean clean_list program