Forum: Compiler & IDEs Compilerfehler bei bootloader für atmega128?


von Nico (Gast)


Lesenswert?

Einen schönen guten Tag an die Gemeinde.

Ich schreibe derzeit einen bootloader für den atmega128. Mit dem 
Linker-Kommando (-Wl,--section-start=.text=0x0f000) habe ich den Code 
inklusive der Interruptvektoren auch an die entsprechende Stelle im 
Flash schieben können. Die Fuse-Bits sind alle richtig gesetzt und IVCE 
und IVSEL sind auch entsprechend gesetzt.

Wenn ich nun den Code simuliere bekomme ich ständig die Meldung falscher 
Opcode an Adresse 0xf000. Im Atmel lande ich auch in einer 
Endlosschleife. Bei genauerer Betrachtung des Hexfiles sollte diese 
Meldung auch stimmen, da die Jumps in den Interruptvektoren alle 
irgendwie nach 0x7846 springen und da steht kein Code.

Hier mal ein Ausschnitt meiner Hexdatei:

:10 F000 00 0C94 4678 0C94 6378 0C94 6378 0C94 6378 31
:10 F010 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 04
:10 F020 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 F4
:10 F030 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 E4
:10 F040 00 0C94 6378 0C94 6378 0C94 8C78 0C94 F878 16
:10 F050 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 C4
:10 F060 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 B4
:10 F070 00 0C94 6378 0C94 6378 0C94 6378 0C94 6378 A4
:10 F080 00 0C94 6378 0C94 6378 0C94 6378 1124 1FBE FD
:10 F090 00 CFEF D0E1 DEBF CDBF 11E0 A0E0 B1E0 E8E9 05
:10 F0A0 00 F6EF 00E0 0BBF 02C0 0790 0D92 A830 B107 49
:10 F0B0 00 D9F7 14E0 A8E0 B1E0 01C0 1D92 A230 B107 79
:10 F0C0 00 E1F7 0C94 6578 0C94 0078 CF93 DF93 CDB7 7B

Was mache ich beim Compilieren falsch bzw. welchen Optionsschalter muss 
ich noch setzen, damit die Adressen in den Jumps stimmen.

Ich verwende derzeit das AVR-Studio in der Version 4.13 und den AVR-GCC 
in der Version 4.1.1.

Vielen Dank schon mal für Eure Hilfe

Nico

von kosmonaut_pirx (Gast)


Lesenswert?

hallo,
hm, poste doch bitte einmal dein makefile, oder aber die aufrufe zum 
bauen des bootloaders.
danke,
bye kosmo

von Nico (Gast)


Lesenswert?

Hier kommt das Makefile:

######################################################################## 
#######
# Makefile for the project atmega128_boot
######################################################################## 
#######

## General Flags
PROJECT = atmega128_boot
MCU = atmega128
TARGET = atmega128_boot.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 -O0
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

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

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS += -Wl,--section-start=.text=0x0f000


## 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 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = main.o uart.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

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

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

uart.o: ../uart.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 $< $@ || exit 0

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

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

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

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

von Nico (Gast)


Angehängte Dateien:

Lesenswert?

und hier kommt im Anhang mal noch das map-file.

Auch hier scheint noch alles zu stimmen. Die vectors sind richtig 
gesetzt.
Nur was bedeutet das 0x698 und das 0x8c hinter .text bzw. .vectors?


.text           0x0000f000      0x698
 *(.vectors)
.vectors       0x0000f000       0x8c 
c:/programme/winavr/bin/../lib/gcc/avr/4.1.1/../../../../avr/lib/avr5/cr 
tm128.o
                0x0000f000                __vectors
                0x0000f000                __vector_default

hoffentlich bekommen wir das noch hin...

Nico

von Nico (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Ausschnitt aus dem list-file...

Es ist deutlich zu erkennen, der jump sollte nach 0xf08c springen, aber 
der Compiler macht daraus 0x7846... warum macht er das?


0000f000 <__vectors>:
    f000:  0c 94 46 78   jmp  0xf08c  ; 0xf08c <__ctors_end>
                      ^^ ^^               ^^^^
    f004:  0c 94 63 78   jmp  0xf0c6  ; 0xf0c6 <__bad_interrupt>
    f008:  0c 94 63 78   jmp  0xf0c6  ; 0xf0c6 <__bad_interrupt>
...

von kosmonaut pirx (Gast)


Lesenswert?

hallo,

map-file ist sicherlich die größe, die da noch hinter steht

einfach mal den code nicht verschieben, was passiert denn dann?

bye kosmo

von Nico (Gast)


Lesenswert?

wenn ich den bootloader in der application-section unter 0x00000 
einbaue, funktioniert alles so wie es soll.

Sobald ich jedoch anfange den Code mit -Wl,--section-start=.text=0xXXXX 
zu verschieben geht es schief und im Hexfile steht bei den 
Jumpanweisungen genau die Hälfte der eigentlichen Sprungadresse.

viele Grüße Nico

von kosmonaut pirx (Gast)


Lesenswert?

na das sagt doch alles.

also beim CAN128 steht über der tabelle mit den section-adressen extra : 
"word sizes"

beim mega128 nicht (seite 286).
sind's aber, da möcht ich wetten.
also mal fix in bytes umrechnen:--section-start=.text=0x1E000

bye kosmo

von Nico (Gast)


Lesenswert?

Hallo Kosmo...

vielen Dank erstmal für Deine eifrige Unterstützung.

Ich habe nur ein Problem... wenn ich jetzt die neue Adresse 0x1E000 
verwende, dann bekomme ich ein Hexfile gebaut welches erst bei 0x1e000 
anfängt und nicht mehr bei 0xf000. Ich müsste also im Hexfile die 
Flashadressen alle per Hand ändern.

Gibt es da nicht einen Optionsschalter bei gcc über den ich die Größe 
angeben kann? Meinetwegen "-blabla word-size"...

Ich finde bei mir leider in keinem File (Makefile ...) und in keiner 
Config-Einstellung des AVR-Studios irgendeinen Hinweis auf "word 
sizes"...


Danke nochmal

Nico

von kosmonaut pirx (Gast)


Lesenswert?

np.

???
die bootloader-section fängt (bei 8kbyte umfang) bei adresse 0x1E000 an. 
was willst du da per hand ändern? die text-section muss ebenso bei der 
adresse anfangen.

erklär mal bitte.
bye kosmo

von Nico (Gast)


Lesenswert?

ok, ok...

das Hexfile ist ja auch nur für den byteweisen Zugriff gedacht. Somit 
stimmt dann natürlich die Adresse... 0xf000 im Flash ist ja nicht 0xf000 
im Hexfile...

ok kosmo, vielen vielen Dank... das Problem ist gelöst... mein Projekt 
kann weiter gehen

viele Grüße Nico

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.