Witam,
Staram się napisać własny bootloader który ma odczytywać plik z karty SD.
Ale nie mogę uporać się z problemem, jak wrzucić bootloader pod odpowiedni adres w pamięci.
Na elektrodzie znalazłem że w AVRStudio (4.X) robi się to przez Project->Configuration Options-> Memory Setings i tam wpisuje:
Efekt kompilacji wydaje się dobry:
Niby pojawia się -section-start=.bootloader=0x3f00, ale postanowiłem się upewnić i znalazłem w temacie:
https://www.elektroda.pl/rtvforum/topic1347896.html
Że w pliku hex początkowy adres powinien być ustalony już na adres w pamięci gdzie ma znajdować się bootloader, u mnie natomiast wygląda to tak:
Czyli rozpoczyna od 0 adresu... ale czemu? Próbowałem wgrywać program a następnie wyciągać wsad z pamięci przez BASCOM który pokazuje że program jest zapisywany od 0.
Chyba że coś źle rozumuję.
------------------------------------------------------------------------------
-----------------------------------EDIT---------------------------------------
------------------------------------------------------------------------------
Coś znalazłem, mianowicie kilka początkowych linijek jest zapisywanych na początku pamięci a pozostałe na końcu, powinno tak być?
Dla przykładu taki prosty program:
Generuje kod hex:
Jak widać 3 ostatnie linie dopiero są umieszczane w pamięci bootloader'a, a te pierwsze linie to co to?
Powinno tak być?
Jeszcze jedno pytanie mam, w czasie wgrywania bootloader'a kasuje on całą początkową pamięć czyli główny program.
Jest jakaś możliwość ustawienia w avrdude aby wgrywał od jakiegoś adresu pamięci do jakiegoś? Tak aby była możliwość aktualizacji przez programator samego bootloadera lub kodu programu?
Staram się napisać własny bootloader który ma odczytywać plik z karty SD.
Ale nie mogę uporać się z problemem, jak wrzucić bootloader pod odpowiedni adres w pamięci.
Na elektrodzie znalazłem że w AVRStudio (4.X) robi się to przez Project->Configuration Options-> Memory Setings i tam wpisuje:
Memory Type: FLASH
Name: .bootloader
Address (Hex): 0x1f80Efekt kompilacji wydaje się dobry:
Build started 23.11.2011 at 00:26:01
avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT OBC-mainboard_boot.o -MF dep/OBC-mainboard_boot.o.d -c ../OBC-mainboard_boot.c
avr-gcc -mmcu=atmega168 -Wl,-Map=OBC-mainboard_boot.map -Wl,-section-start=.bootloader=0x3f00 OBC-mainboard_boot.o -o OBC-mainboard_boot.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature OBC-mainboard_boot.elf OBC-mainboard_boot.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex OBC-mainboard_boot.elf OBC-mainboard_boot.eep || exit 0
avr-objdump -h -S OBC-mainboard_boot.elf > OBC-mainboard_boot.lss
AVR Memory Usage
----------------
Device: atmega168
Program: 398 bytes (2.4% Full)
(.text + .data + .bootloader)
Data: 8 bytes (0.8% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...Niby pojawia się -section-start=.bootloader=0x3f00, ale postanowiłem się upewnić i znalazłem w temacie:
https://www.elektroda.pl/rtvforum/topic1347896.html
Że w pliku hex początkowy adres powinien być ustalony już na adres w pamięci gdzie ma znajdować się bootloader, u mnie natomiast wygląda to tak:
:10 0000 00 0C9434000C943E000C943E000C943E00 82Czyli rozpoczyna od 0 adresu... ale czemu? Próbowałem wgrywać program a następnie wyciągać wsad z pamięci przez BASCOM który pokazuje że program jest zapisywany od 0.
Chyba że coś źle rozumuję.
------------------------------------------------------------------------------
-----------------------------------EDIT---------------------------------------
------------------------------------------------------------------------------
Coś znalazłem, mianowicie kilka początkowych linijek jest zapisywanych na początku pamięci a pozostałe na końcu, powinno tak być?
Dla przykładu taki prosty program:
Kod: C / C++
Generuje kod hex:
:100000000C9434000C943E000C943E000C943E0082
:100010000C943E000C943E000C943E000C943E0068
:100020000C943E000C943E000C943E000C943E0058
:100030000C943E000C943E000C943E000C943E0048
:100040000C943E000C943E000C943E000C943E0038
:100050000C943E000C943E000C943E000C943E0028
:100060000C943E000C943E0011241FBECFEFD4E050
:10007000DEBFCDBF0E94001F0C9440000C94000016
:04008000F894FFCF22
:103E000090E020E28BB182278BB99F5F9530D1F78C
:063E100080E090E008953F
:00000001FFJak widać 3 ostatnie linie dopiero są umieszczane w pamięci bootloader'a, a te pierwsze linie to co to?
Powinno tak być?
Jeszcze jedno pytanie mam, w czasie wgrywania bootloader'a kasuje on całą początkową pamięć czyli główny program.
Jest jakaś możliwość ustawienia w avrdude aby wgrywał od jakiegoś adresu pamięci do jakiegoś? Tak aby była możliwość aktualizacji przez programator samego bootloadera lub kodu programu?