Start adres van flash wijzigen

IDE gerelateerde berichten
Berichten: 3
Geregistreerd: 09 Mei 2016, 15:10

Start adres van flash wijzigen

Berichtdoor Kaaiman » 09 Mei 2016, 15:36

Hoi allemaal,

Ik heb een custom bootloader gemaakt. Nu wil ik graag het start adres van mijn applicatie in arduino IDE wijzigen maar dit lukt nog niet. Ik heb al gezocht naar een linkerscript of memorymap maar kan dit niet echt vinden in arduino.

Kan iemand mij verder helpen hoe ik het FLASH startadres kan veranderen?
MCU -> ATMEGA 168 (arduino lilypad)

Alvast super bedankt.
Gr,
Kaaiman

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Start adres van flash wijzigen

Berichtdoor nicoverduin » 09 Mei 2016, 17:58

Dat klopt. De start van een applicatie is op adres 0000. De bootloader wordt aan het eind van het flash geheugen geplaatst. Als je kijkt in de folder van de bootloaders (in de Arduino IDE) dan zie je bij de lilypad een makefile. Deze is als volgt:
cpp code
# Makefile for ATmegaBOOT
# E.Lins, 18.7.2005

# Instructions
#
# To build the bootloader for the LilyPad:
# make lily


# program name should not be changed...
PROGRAM = ATmegaBOOT_168

# enter the target CPU frequency
AVR_FREQ = 8000000L

# enter the parameters for the avrdude isp tool
ISPTOOL = stk500v2
ISPPORT = usb
ISPSPEED = -b 115200

MCU_TARGET = atmega168
LDSECTION = --section-start=.text=0x3800

# the efuse should really be 0xf8; since, however, only the lower
# three bits of that byte are used on the atmega168, avrdude gets
# confused if you specify 1's for the higher bits, see:
# http://tinker.it/now/2007/02/24/the-tal ... its-fuses/
#
# similarly, the lock bits should be 0xff instead of 0x3f (to
# unlock the bootloader section) and 0xcf instead of 0x0f (to
# lock it), but since the high two bits of the lock byte are
# unused, avrdude would get confused.
ISPFUSES = avrdude -c $(ISPTOOL) -p m168 -P $(ISPPORT) $(ISPSPEED) -e -u -U lock:w:0x3f:m -U efuse:w:0x00:m -U hfuse:w:0xdd:m -U lfuse:w:0xff:m
ISPFLASH = avrdude -c $(ISPTOOL) -p m168 -P $(ISPPORT) $(ISPSPEED) -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m


OBJ = $(PROGRAM).o
OPTIMIZE = -O2

DEFS =
LIBS =

CC = avr-gcc


# Override is only needed by avr-lib build system.

override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
override LDFLAGS = -Wl,$(LDSECTION)
#override LDFLAGS = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)

OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump

all:

lily: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3'
lily: $(PROGRAM).hex

$(PROGRAM).hex: $(PROGRAM).elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@

$(PROGRAM).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

$(OBJ):
avr-gcc $(CFLAGS) $(LDFLAGS) -c -g -O2 -Wall -mmcu=atmega168 ATmegaBOOT.c -o ATmegaBOOT_168.o

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

%.srec: %.elf
$(OBJCOPY) -j .text -j .data -O srec $< $@

%.bin: %.elf
$(OBJCOPY) -j .text -j .data -O binary $< $@

clean:
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex

install:
avrdude -p m168 -c stk500v2 -P /dev/cu.USA19H1b1P1.1 -e -u -U lock:w:0x3f:m -U efuse:w:0x00:m -U hfuse:w:0xdd:m -U lfuse:w:0xe2:m
avrdude -p m168 -c stk500v2 -P /dev/cu.USA19H1b1P1.1 -e -u -U flash:w:ATmegaBOOT_168.hex -U lock:w:0x0f:m


Daarin staat op regel 22:
cpp code
LDSECTION  = --section-start=.text=0x3800

Dat het .text segment (=Flash geheugen) begint op adres HEX 3800. Als je de Hex file bekijkt zie je ook dat deze daar begint.
Dus je moet de make file evt. aanpassen en dan de bootloader opnieuw opbouwen. Wordt hij groter moet je dus zakken met je .text adres.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 09 Mei 2016, 15:10

Re: Start adres van flash wijzigen

Berichtdoor Kaaiman » 10 Mei 2016, 10:11

Dankjewel Nico voor jou reactie!

Ik begrijp dat dit specifiek voor de Arduino bootloaders is. Deze hebben een makefile waarin je het startadres kunt wijzigen. Alleen nu wil ik het startadres van mijn applicatie wijzigen. Dit kan ik helaas nog niet vinden hoe dit gaat in Arduino. het werkt zover ik kan zien niet met een makefile.

Weet jij waar ik dat zou kunnen aanpassen?

Alvast super bedankt.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Start adres van flash wijzigen

Berichtdoor nicoverduin » 10 Mei 2016, 10:48

Ja maar als jij het start adres veranderd in jouw applicatie hoe weet de CPU dan dat hij naar een nieuw adres moet gaan? De PC start altijd op 0.
Maar los van dat:
De IDE maakt wel gebruik van een make, maar waar hij die verstopt is mij niet duidelijk. Dat maakt op zich niet uit want je moet een aanpassing maken in de platform.txt. Die kun je vinden in <installatatie folder Arduinoe IDE>\hardware\arduino\avr

Een deel daarvan ziet er ongeveer als volgt uit:
cpp code
# Arduino AVR Core and platform.
# ------------------------------

# For more info:
# https://github.com/arduino/Arduino/wiki ... cification

name=Arduino AVR Boards
version=1.5.8

# AVR compile variables
# ---------------------

# Default "compiler.path" is correct, change only if you want to overidde the initial value
compiler.path={runtime.ide.path}/hardware/tools/avr/bin/
compiler.c.cmd=avr-gcc
compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD
# -w flag added to avoid printing a wrong warning http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59396
# This is fixed in gcc 4.8.3 and will be removed as soon as we update the toolchain
compiler.c.elf.flags=-w -Os -Wl,--gc-sections
compiler.c.elf.cmd=avr-gcc
compiler.S.flags=-c -g -x assembler-with-cpp
compiler.cpp.cmd=avr-g++
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
compiler.ar.cmd=avr-ar
compiler.ar.flags=rcs
compiler.objcopy.cmd=avr-objcopy
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
compiler.elf2hex.flags=-O ihex -R .eeprom
compiler.elf2hex.cmd=avr-objcopy
compiler.ldflags=
compiler.size.cmd=avr-size


Het gaat in dit voorbeeld om regel 19. Daar staan o.a. de flags voor de combiner. Dus waar alle obj files aan elkaar gelinked worden.

Deze regel dus:
cpp code
compiler.c.elf.flags=-w -Os -Wl,--gc-sections


Moet je uitbreiden met het start adres. Hier 0400 als voorbeeld

cpp code
compiler.c.elf.flags=-w -Os -Wl,--gc-sections -Ttext=0x0400


De hex file zal nu ook starten op 0400.
Hier als voorbeeld van een lege sketch.
cpp code
:100400000C9434020C9446020C9446020C9446025E
:100410000C9446020C9446020C9446020C9446023C
:100420000C9446020C9446020C9446020C9446022C
:100430000C9446020C9446020C9446020C9446021C
:100440000C945A020C9446020C9446020C944602F8
:100450000C9446020C9446020C9446020C944602FC
:100460000C9446020C94460211241FBECFEFD8E034
:10047000DEBFCDBF21E0A0E0B1E001C01D92A930F8
:10048000B207E1F70E944B020C94DF020C940002C9
:100490000895089508950E94A4020E944A020E94AD
:1004A0004802C0E0D0E00E9449022097E1F30E9498
:1004B0000000F9CF1F920F920FB60F9211242F93C5
:1004C0003F938F939F93AF93BF938091010190913E
:1004D0000201A0910301B09104013091000123E0D9
:1004E000230F2D3720F40196A11DB11D05C026E86C
:1004F000230F0296A11DB11D2093000180930101DD
:1005000090930201A0930301B0930401809105012F
:1005100090910601A0910701B09108010196A11DDB
:10052000B11D8093050190930601A0930701B0933C
:100530000801BF91AF919F918F913F912F910F90A3
:100540000FBE0F901F901895789484B5826084BD7B
:1005500084B5816084BD85B5826085BD85B58160C7
:1005600085BDEEE6F0E0808181608083E1E8F0E027
:100570001082808182608083808181608083E0E856
:10058000F0E0808181608083E1EBF0E08081846035
:100590008083E0EBF0E0808181608083EAE7F0E037
:1005A000808184608083808182608083808181609B
:1005B00080838081806880831092C1000895F894C0
:0205C000FFCF6B
:0400000300000400F5
:00000001FF
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 09 Mei 2016, 15:10

Re: Start adres van flash wijzigen

Berichtdoor Kaaiman » 10 Mei 2016, 11:05

Hoi Nico,

Dankjewel!!! dit werkt perfect.

Antwoord op jou vraag:
Ik heb een eigen bootloader gemaakt die op adres 0x0000 staat. Deze kijkt of er een geldige applicatie aanwezig is en springt dan naar het adres van de applicatie. Zo niet dan blijft hij wachten tot er via communicatie een geldige nieuwe applicatie wordt aangeboden.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Start adres van flash wijzigen

Berichtdoor nicoverduin » 10 Mei 2016, 12:35

Mooi opgelost! en helder.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten