Start adres van flash wijzigen
6 berichten
• Pagina 1 van 1
Start adres van flash wijzigen
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Start adres van flash wijzigen
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
Daarin staat op regel 22:
cpp code
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.
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.
Re: Start adres van flash wijzigen
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.
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.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Start adres van flash wijzigen
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
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
Moet je uitbreiden met het start adres. Hier 0400 als voorbeeld
cpp code
De hex file zal nu ook starten op 0400.
Hier als voorbeeld van een lege sketch.
cpp code
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
Re: Start adres van flash wijzigen
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.
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.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Start adres van flash wijzigen
Mooi opgelost! en helder.
6 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten