ISR in Assembler mit GCC

Gast #456424
Lesenswert?

Gude!

Ich hab mich schon daran gehalten:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Assembler-Dateien_2
Trotzdem krieg ich es nicht hin eine ISR in Assembler zu schreiben.

Eine externe Datei im Verzeichnis der anderen Quellcodedateien hab ich 
angelegt: isr.S der Code sieht so aus:

#include <io.h>

.global TIMER1_CAPT_vect
TIMER1_CAPT_vect:

push ...
push ...
[...]
pop ...
pop ...
reti
.end

Dann im Makefile die Zeile ASRC = isr.S eingefügt.

Jedoch findet der Compuler die isr.S nicht, compiliert auch nix.

Weiß jemand was ich da falsch mache?
Gast #457807
Lesenswert?

Also hier das Makefile:
Kenn mich mit Makefiles nicht aus, genügt es nicht die oben erwähnte 
Zeile einzufügen?


######################################################################## 
#######
# Makefile for the project F42
######################################################################## 
#######

## General Flags
PROJECT = F42
MCU = atmega8
TARGET = F42.elf
CC = avr-gcc.exe

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2                -DF_CPU=16000000UL -Os 
-fsigned-char
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0

ASRC = isr.S

## Objects that must be built in order to link
OBJECTS = F42.o UartPrintF.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

## Build
all: $(TARGET) F42.hex F42.eep F42.lss size

## Compile
F42.o: ../F42.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

UartPrintF.o: ../UartPrintF.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
   $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o 
$(TARGET)

%.hex: $(TARGET)
  avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
  avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

size: ${TARGET}
  @echo
  @avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) F42.elf dep/* F42.hex F42.eep F42.lss

## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
#457821
Lesenswert?

> Kenn mich mit Makefiles nicht aus

Dann wirds Zeit.

> genügt es nicht die oben erwähnte Zeile einzufügen?

<Ausschnitt>

ASRC = isr.S

## Objects that must be built in order to link
OBJECTS = F42.o UartPrintF.o

</Ausschnitt>

Was denkst du was der Kommentar
## Objects that must be built in order to link

zu sagen hat?

Da wird also zumindest noch ein isr.o mit
aufgenommen werden müssen.
Dann brauchst du natürlich noch eine Regel im
Makefile, die besagt wie das isr.o aus dem
isr.S ensteht.

Schau doch einfach mal den Rest des Makefiles
durch und versuch zu verstehen wie das funktioniert.
Das ist wirklich Watscheneinfach.
#457825
Lesenswert?

Wobei eigentlich noch die Frage bleibt
warum du den ISR in Assembler schreiben willst.

Es gibt eigentlich nur 2 Gründe dafür
* Du hast dir den Compiler generierten angeschaut
  und festgestellt, dass du den einen oder anderen
  Zyklus einsparen kannst. Da du auf jeden einzelnen
  Zyklus angewiesen bist, bleibt dir nichts anderes
  übrig als den Compiler zu überstimmen und den ISR
  selbst zu schreiben.

* Dein Programmaufbau ist alles andere als optimal
  und du kommst hinten und vorne mit dem Timing nicht
  hin. Anstatt aber den Programmaufbau zu verbessern
  und eventuell das Verfahren (den Algorithmus) zu wechseln,
  denkst du das ein Wechseln auf Assembler das Problem
  lösen könnte.
  Was es meistens nicht tut.

Meistens liegt Fall 2 vor. Deshalb habe ich nachgefragt.
Gast #457952
Lesenswert?

Ja bei mir ist es Fall 2 wie Du schon sagst.
Der Wechsel auf Assembler hat auch nix gebracht, bzw. waren die 
Einsparungen nicht der Rede Wert. Ich glaub ich muss dann mal das 
Programm an sich optimiern, Verfahren usw.
Danke für die Hilfe. Das Makefile werd ich noch bearbeiten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren