Gibt es einen Weg automatisch zu erkennen ob der Code für einen AVR mit <=64k FLASH oder >64k FLASH compiliert wird? Testen auf _AVR31_, _AVR51__ und __AVR6_ fällt mir jetzt dazu ein. Ich bin aber nicht sicher damit alles zu erwischen. Und käme ein _AVR7_ dazu würde das ja nicht mehr funktionieren. Ich will je nach Target automatisch pgm_read_byte_near() und pgm_read_byte_far() umschalten lassen.
Gast
#5344049
Rudolph R. schrieb: > Gibt es einen Weg automatisch zu erkennen ob der Code für einen AVR mit > <=64k FLASH oder >64k FLASH compiliert wird?
1 | |
2 | |
3 | |
Ähnlich für die Unterscheidung <=128k vs. >128k:
1 | |
2 | |
3 | |
Danke!
c-hater schrieb: > .IFDEF RAMPZ Es gibt Devices, die RAMPZ für RAM-Zugriff verwenden. Daher sollte besser auf z.B. ELPM getestet werden:
1 | |
https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html#AVR-Built-in-Macros Und avr-libc hat Makros wie FLASHEND:
1 | |
2 | |
3 | |
4 | |
5 | |
-->
1 | |
2 | |
Gast
#5344796
Johann L. schrieb: > c-hater schrieb: >> .IFDEF RAMPZ > > Es gibt Devices, die RAMPZ für RAM-Zugriff verwenden. Und weniger als 64k Flash haben? Kannst du Beispiele nennen?
Gast
#5345592
c-hater schrieb: > Und weniger als 64k Flash haben? Kannst du Beispiele nennen? Nein, das kann er natürlich nicht. Deswegen ist sein Einwurf genau nur als eins zu werten: Eine Sache, die eine völlig unnötige Abhängigkeit zum gcc schafft. Also eigentlich das typische Microsoft-Konzept: wir schaffen unnötige Abhängigkeiten, damit du Dummdödel von Programmierer allein schon aus Faulheit auch in Zukunft als "Multiplikator" für unseren Schmutz agierst. Leute, laßt euch nicht von solchen Typen verarschen und an die Kandare nehmen. Denkt beim Programmieren auch immer über die Wirkungen der verwendeten Infrastruktur nach. Die für auch selber und die für eure Kunden. Das beste Konzept ist immer eine Minimierung der Abhängigkeiten. Hier ist das wirklich mal sehr einfach möglich. Also: Tut besser nicht, was Lilith rät... (Wer sich mit der Bibel nicht so auskennt: Lilith ist das Werkzeug des Teufels, die ultimative Verführerin. Ich selber bin zwar Atheist, halte das aber im konkreten Fall für ein schönes poetisches Bild für den Sachverhalt). Man könnte auch einfach sagen: nimm' von niemandem einen Rat an, dessen Intentionen du nicht hinterfragt hast...
Gast
#5345593
Die gcc ist allerdings kein "Schmutz" vor deren Abhängigkeit man sich fürchten muss. Schon gar nicht ist die Bestandteil eines Imperiums, dass die Welt knechten will. Die gcc ist ein Community Open-Source Projekt.
Gast
#5345603
Stefan U. schrieb: > Die gcc ist allerdings kein "Schmutz" vor deren Abhängigkeit man sich > fürchten muss. Schon gar nicht ist die Bestandteil eines Imperiums, dass > die Welt knechten will. > > Die gcc ist ein Community Open-Source Projekt. Mit vielen Verfechtern, deren Methoden denen der religiösen Eifererer diverser Kirchen kaum noch nachstehen und auch nicht denen der kommerziellen Konkurrenz... Genau das ist ja das Schlimme...
Gast
#5345614
Du bist mir ja einer ... Dann geh' doch zu Apple!
Gast
#5345618
Stefan U. schrieb: > Du bist mir ja einer ... > Dann geh' doch zu Apple! Was hat Apple damit zu tun? Mal abgesehen davon, dass die (auf Grund der überwiegend geistig minderbemittelten Nutzerschaft) noch sehr viel erfolgreicher damit sind, unnötige Abhängigkeiten als "Standard" zu setzen. Das ist, wovon Microsoft träumt und offensichtlich auch viele gcc-Verfechter...
c-hater schrieb: > c-hater schrieb: > >> Und weniger als 64k Flash haben? Kannst du Beispiele nennen? > > Nein, das kann er natürlich nicht. > > Deswegen ist sein Einwurf genau nur als eins zu werten: Eine Sache, die > eine völlig unnötige Abhängigkeit zum gcc schafft. Also eine "Antwort, die eine Abhängigkeit schafft". soso. ROFL. Es ist eine Antwort auf die Frage des OT, abhängig von der Flashgröße (bedingt) zu compilieren, unter Verwendung einer zugegeben unbekannten Toolchain. Die Frage habe ich also für eine Toolchain beantwortet, für die ich die Antwort sicher weiß, und zwar — wie vom OT gewünscht — unanhängig vom konkreten Devices, sei es ein existierendes oder ein zukünftiges.
Gast
#5345898
Und in der .inc-Datei von Atmel steht dann für den ATmega128 für FLASHEND der Wort-Wert mit 0xffff. Das ist schon etwas befremdlich.
Gast
#5345922
Der Programmspeicher ist 16bit breit. Die Adresse 0x0000 zeigt auf das erste Wort. Die Adresse 0x0001 zeigt auf das zweite Wort. Wort, nicht Byte. Beim RAM ist das anders, das wird Byteweise adressiert.
Gast
#5345932
Durchaus klar und altbekannt. Was ich mit 'befremdlich' meinte, war, dass gcc FLASHEND umdefiniert.
S. Landolt schrieb: > Was ich mit 'befremdlich' meinte, war, dass gcc FLASHEND umdefiniert. Adressen wie char* in C sind immer Byte-Adressen. Übrigens kommt das define aus den Geadern der avr-libc, welche auch mit Assembler zusammen funktionieren.
c-hater schrieb: > Stefan U. schrieb: > >> Du bist mir ja einer ... >> Dann geh' doch zu Apple! > > Was hat Apple damit zu tun? Mal abgesehen davon, dass die (auf Grund der > überwiegend geistig minderbemittelten Nutzerschaft) noch sehr viel > erfolgreicher damit sind, unnötige Abhängigkeiten als "Standard" zu > setzen. Das ist, wovon Microsoft träumt und offensichtlich auch viele > gcc-Verfechter... Du wäscht bestimmt auch mit Waschnüssen statt Waschmittel und verwendest Abspülwasser für die Toilette? :-)
Schon krass wie das hier immer wieder aus dem Ruder läuft. Johann L. schrieb: > Es gibt Devices, die RAMPZ für RAM-Zugriff verwenden. Daher sollte > besser auf z.B. ELPM getestet werden: Das geht zwar schon schwer in Richtung Dinge die mich überhaupt nicht interessieren, weil sich da gefälligst der Compiler drum kümmern soll. Aber ich bin ja neugierig. In www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf findet sich erstmal das hier: --- RAMPX, RAMPY, and RAMPZ Registers concatenated with the X-, Y-, and Z-registers enabling indirect addressing of the whole data space on MCUs with more than 64KB data space, and constant data fetch on MCUs with more than 64KB program space. --- Nur, es gibt doch gar keine AVR mit mit mehr als 64kB Daten? Und versagen würde der Test auf RAMPZ doch nur auf Devices mit 64k FLASH und >64k SRAM? Vielleicht ist die Beschreibung auch nicht mehr aktuell und es gibt Devices bei denen der Speicher anders organisiert ist, so mehr in einem Adress-Raum hintereinander anstatt parallel mit getrennten Adressen? Klingt jetzt irgendwie nicht so schlau, wenn man ein Device hat mit z.B. 64k FLASH und ein paar k SRAM die hinter dem FLASH liegen, dann würde das doch erheblich Overhead erzeugen FLASH und SRAM auf die gleiche Art und Weise anzusprechen. Wenn das insgesamt unter 64k bleibt sieht die Sache ja wieder anders aus. Welche Devices sind das konkret die RAMPZ für den RAM-Zugriff verwenden?
Gast
#5346280
Hi
>Welche Devices sind das konkret die RAMPZ für den RAM-Zugriff verwenden?
RAMPZ wird auch für den byteweisen Zugriff auf den Flash, via
Assemblerinstruktion 'LPM', verwendet.
MfG Spess
Rudolph R. schrieb: > Welche Devices sind das konkret die RAMPZ für den RAM-Zugriff verwenden? XMEGA64A1U und XMEGA128A1U mittels EBI.
spess53 schrieb: > RAMPZ wird auch für den byteweisen Zugriff auf den Flash, via > Assemblerinstruktion 'LPM', verwendet. Via ELPM bzw. ELPMx; wobei die Unterstützung letzterer die Unterstützung ersterer impliziert.
spess53 schrieb: > RAMPZ wird auch für den byteweisen Zugriff auf den Flash, via > Assemblerinstruktion 'LPM', verwendet. LPM verwendet RAMPZ doch gar nicht, sondern ELPM macht das? Horst M. schrieb: > XMEGA64A1U und XMEGA128A1U mittels EBI. Naja, XMega unterstütze ich soweit ohnehin nicht, das wäre dann wieder ein eigener Pfad. Was mir aber gerade beim rumprobieren aufgefallen ist, das vorhandensein von RAMPZ ist in der Tat kein Hinweis auf ein Device >64k.
1 | |
2 | |
Während das zum Beispiel für Mega328 und Mega644 durch läuft, gibt es mit dem Mega1284 einen Fehler, also wie gewünscht. Aber Mega4808, Mega4809 haben nur 48kB und das gibt einen Fehler. Noch interessanter finde ich, AT90CAN32, AT90CAN64 und AT90CAN128 sind offenbar alle gleich, die haben alle drei das RAMPZ Register. Aber ELPM hat nur AT90CAN128. Ein pgm_read_byte_far() wird mit dem 90CAN32 auch anstandlos übersetzt, nur ist das ja nicht notwendig. Okay, streng genommen könnte man auch auf Devices >64k FLASH ein pgm_read_byte_near() verwenden solange alles in die unteren 64k passt. Aber das lässt sich eher nicht automatisch einfangen. :-) Also wofür auch immer übrhaupt mindestens 90CAN32, 90CAN64, Mega4808 und Mega4809 ein RAMPZ Register haben, die sind unter 64k und damit führt der Test darauf nicht zum gewünschten Ergebnis. Ich habe jetzt sicher nicht alle Megas durchprobiert,
1 | |
2 | |
macht aber gar nichts auf 90CAN32, 90CAN64, Mega4808 und diversen anderen. Also dann so, danke. Dass das jetzt nur für den GCC funktioniert kümmert mich auch wenig, einen anderen Compiler nutze ich da sowieso nicht. Und der Block fängt so an:
1 | |
2 | |
3 | |
Andere Targets unter anderen Compilern sind da gar kein Problem, man muss das nur entsprechend dazu eintragen. Die XMega müssten unter "__AVR_XMEGA__" laufen, oder? Aber mit den Dingern werde ich mich jetzt sowieso nicht mehr beschäftigen. Eher kommt da ein SAME51 dazu.
Rudolph R. schrieb: > Dass das jetzt nur für den GCC funktioniert kümmert mich auch wenig, > einen anderen Compiler nutze ich da sowieso nicht. Gibt ja noch FLASHEND, das ist sogar noch näherliegend als ELPM weil es sich direkt auf die Flashgröße bezieht und nicht auf den Instruktionssatz. ATmega4808/9 kennt die aktuelle Release nicht. Da braucht's dann nen eigenen specs für, z.B. von Atmel. > Die XMega müssten unter "__AVR_XMEGA__" laufen, oder? Ja, siehe http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html#AVR-Built-in-Macros Wobei inzwischen einige der Makros nicht mehr built-in sind sondern via specs qua Kommandozeile -D definiert werden.
Johann L. schrieb: > Gibt ja noch FLASHEND, das ist sogar noch näherliegend als ELPM weil es > sich direkt auf die Flashgröße bezieht und nicht auf den > Instruktionssatz. Nur reicht FLASHEND dafür ja nicht unbedingt. Ich habe gerade in die Unterlagen von dieser neuen "megaAVR 0-series" geschaut und die haben als feature "The Flash memory is mapped into the data space". Ist jetzt dafür soweit kein Problem aber starten bei 0x4000 und haben mit 48k das FLASHEND bei 0xffff. Wer weiss was denen noch so einfällt, mit mehr als 48k läuft das ja aus dem 16Bit Adress-Raum und FLASHEND wäre entsprechend jenseits 0xffff. Klingt jetzt nicht besonders sinnvoll, okay. Aber man müsste auch noch prüfen ob FLASHSTART überhaupt definiert ist und falls ja ob FLASHEND - FLASHSTART größer 0xffff ist. Also irgendwann ist ja auch mal Schluss, ich lasse das jetzt mit ELPM erstmal so. :-) > ATmega4808/9 kennt die aktuelle Release nicht. Da braucht's dann nen > eigenen specs für, z.B. von Atmel. Na, irgendwas wurde wohl gemacht für "AVR 8-bit GCC Toolchain 3.6.1", die lassen sich ja auswählen und für compilieren. Aber scheinbar haben die gar kein RAMPZ, ich wundere mich schon warum das denen angedichtet wird. Wenigstens kein ELPM.
Gast
#5346783
Hi >Wer weiss was denen noch so einfällt, mit mehr als 48k läuft das ja aus >dem 16Bit Adress-Raum und FLASHEND wäre entsprechend jenseits 0xffff. >Klingt jetzt nicht besonders sinnvoll, okay. Nö. Der Flash kann mehr als 48 k haben: megaAVR® 0-Series Manual(S.19): >The Flash memory can be read with the >LPM instruction. For the LPM instruction, the Flash start address is 0x0000. MfG Spess
Rudolph R. schrieb: > Ich habe gerade in die Unterlagen von dieser neuen "megaAVR 0-series" > geschaut und die haben als feature "The Flash memory is mapped into the > data space". Die momentan unterstützten Devices mit diesem Feature (avrtiny, avrxmega3) haben alle einen Flash-Start bei 0x0, allerdings ist der Flash auch im RAM Adressraum zu sehen, und zwar ab einem bestimmten Offset: 0x4000 für avrtiny und 0x8000 für avrxmega3. Das funktioniert ähnlich wie mit SRAM vs. I/O, welche einen Offset haben (der auch 0 sein darf) und die mit LDx/STx vs. IN/OUT zugegriffen werden. Bei RAM vs. Flash ist der Offset __AVR_PM_BASE_ADDRESS__, wobei hier ein Offset von 0 bedeutet, dass Flash nicht im RAM-Space sichtbar ist. Der Zugriff erfolgt per LDx vs. LPM. __AVR_PM_BASE_ADDRESS__ braucht einen normalerweise nicht zu interessieren; der Offset wird von den Tools automatisch addiert:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
1 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
> Ist jetzt dafür soweit kein Problem aber starten bei 0x4000 und haben > mit 48k das FLASHEND bei 0xffff. FLASHEND sollte bei 0xbfff sein. > Wer weiss was denen noch so einfällt, mit mehr als 48k läuft das ja aus > dem 16Bit Adress-Raum und FLASHEND wäre entsprechend jenseits 0xffff. Wenn es wirklich mal solche Devices gibt, d.h. FLASHEND + __AVR_PM_BASE_ADDRESS__ > 0xffff, dann wäre ein Teil des Flash nicht mehr im RAM-Space sichtbar. Die von dir genannten neuen 0-Devices sind noch nicht von den GNU-Tools unterstützt, evt. müsste nen neuer Multilib-Zweig her; zum Testen geht aber wohl auch avrxmega3 mit -Wl,--defsym,__RODATA_PM_OFFSET__=0x4000. >> ATmega4808/9 kennt die aktuelle Release nicht. Da braucht's dann nen >> eigenen specs für, z.B. von Atmel. specs sind Text, das geht auch von Hand; z.B. ableiten von specs-attiny1616, und die Multilib müsste auch passen. Die meiste Arbeit ist dann io.h, was ja auch in crt*.o verwendet wird.
Diese "0-Series" nutze ich selber sowieso nicht, ist mir nur beim Durchklicken durch diverse Devices und Compilieren dafür aufgefallen. Solange es keinen AVR mit CAN-FD gibt, vorzugsweise zwei Kanäle, werde ich mich von den AVR gezwungenermassen auch langsam abwenden müssen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.