Hallo zusammen,
ich rechne eine CRC über meinen Programmcode und hab dazu eine
Dummy-Section angelegt, deren Adresse mir anzeigt, wo der Programmcode
aufhört:
Der Wert AddresseVonDummy liegt an einer fixen Adresse im Hexfile, damit
ich den Wert im Bootloader auslesen kann.
Das funktioniert einwandfrei, aber nur mit 16Bit-Adressen.
Wenn ich ganze für einen ATMega1284 bauen will, bräuchte ich
32Bit-Adressen.
Wenn ich nun folgendes probiere
Eine Funktion, die eine CRC auf einen Datenblock im RAM berechnet, ist
auf einem AVR nicht für ROM einsetzbar. Das musst du Byte für Byte
berechnen, indem du mit einem Pointer ins ROM jedes Byte holst.
A. K. schrieb:> Eine Funktion, die eine CRC auf einen Datenblock im RAM berechnet,> ist> auf einem AVR nicht für ROM einsetzbar. Das musst du Byte für Byte> berechnen, indem du mit einem Pointer ins ROM jedes Byte holst.
Sicher, aber das hat nichts mit meinem Problem zu tun.
Mir geht es nur darum, wie ich auf einem AtMega1284 den Adressen
jenseits der 64kByte darstellen kann.
Wir lösen auf:
Dein ATMega1284 Build nutzt ein anderes Linker Skript, dass keine
"dummy" Section kennt. Daher landet dummy an Addresse Null.
Schau also mal bei den entsprechenden Linker Skripten nach.
Den kann ich auf einem ATMega644 oder auf einem ATMega1284 erzeugen, und
es gibt immer das gleiche Ergebnis:
In AddresseVonDummy16 stehen die korrekten unteren 16Bit der Adresse von
Dummy drinn.
In AddresseVonDummy32 steht 0x00000000 drinn.
Siehe Hexfile vom ATMega128P:
Dummy liegt an Adresse 0x0000050A.
AddresseVonDummy32 liegt an Adresse 0x1F7F4 und enthält 0x00000000.
AddresseVonDummy16 liegt an Adresse 0x1F7F8 und enthält 0x050A.
Frank Roggel schrieb:> Wenn ich ganze für einen ATMega1284 bauen will, bräuchte ich> 32Bit-Adressen.
Ich würde dafür einfach eine kleine Assembler-Datei in das Projekt
integrieren:
1
.global AddresseVonDummy
2
.section .addressevondummy,"a",@progbits
3
.type AddresseVonDummy, @object
4
.size AddresseVonDummy, 4
5
AddresseVonDummy:
6
.byte lo8(Dummy)
7
.byte hi8(Dummy)
8
.byte hh8(Dummy)
9
.byte 0
Kleiner Hinweis am Rande:
Es heißt eigentlich "Adresse" (mit einfachem d).
Frank Roggel schrieb:> const uint16_t Dummy __attribute__((section (".dummy" ),
Schlecht, vermutlich eine Orphan Section. Deren Position wird als durch
implizite Regeln von ld für entsprechende Sections bestimmt.
Besser: definier ein eigenes Symbol in deinem Linker Skript. Hat zudem
den Vorteil, dass der CRC nicht nur über Code geht sondern auch über die
Daten, welche zur Initialisierung des SRAM verwendet werden (also für
.data und .rodata).
An die Adresse kommt man dann z.B. so:
1
#include<stdint.h>
2
3
externuint8_t__data_load_end;// defined in ld script
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.