Hallo liebes Forum, ich hab eine grundlegende Frage. Ich habe eine Tabelle im ROM liegen und um lookups effizient zu machen habe ich die Startadresse festgelegt, so dass ich das high byte vom pointer als index nutzen kann. (.CSEG .ORG 256). So liegt die Tabelle im Moment am ende vom Programmcode. Versuche ich die Tabelle in z.B. nach "vorne"(.ORG 128) zu legen meldet der Compiler Adressekonflikte. Das gleiche passiert natürlich auch wenn der Programmcode größer wird und in die Tabelle hineinwächst. Wie kann man so etwas elegant lösen? Der Grund ist, dass ich gerne mehrere Tabellen anlegen mochte bei denen das highbyte als index nutzbar ist, aber ohne dabei den programcode zu fragmentieren. Ausserdem ist etwas umstaendlich immer von Hand die tabellen an das ende des programmcodes zu legen.
Welcher Prozessor ist das überhaupt? > Ich habe eine Tabelle im ROM liegen Was jetzt EEPROM oder ROM. Je nach Prozessor muss das nicht gleich sein. Und je nach Prozessor kostet dich der EEPROM Zugriff so viel, dass die eine eingesparte Addition für den Index unter 'ferner liefen' fällt (zb beim AVR). D.h. Du machst dir zb auf einem AVR Arbeit für etwas, was dir in der Realität so gut wie keinen Geschwindigkeitsvorteil bringt. Daher die Frage nach dem Prozessor.
1 | .org pc + 0x7F & 0xFF80 ;alignment |
Karl hat recht, in der Praxis hat das keinen merkbaren Effekt. Peter
Vielen Dank fuer Eure Antworten. Allerdings stimme ich nicht zu. (Lasse mich aber gerne uberzeugen.) Folgendes Beispiel auf einem ATtiny45: Eine funktionen die viel gebrauch von lookuptabellen macht und haeufig aufgerufen wird.
1 | ldi ZH, high(table1<<1) |
2 | loop1: |
3 | ... |
4 | rcall perform_lookups |
5 | ... |
6 | rjmp loop1 |
7 | |
8 | perform_lookups: |
9 | mov ZL, R10 |
10 | LPM R10, Z |
11 | mov ZL, R11 |
12 | LPM R11, Z |
13 | mov ZL, R12 |
14 | LPM R12, Z |
15 | mov ZL, R13 |
16 | LPM R13, Z |
17 | mov ZL, R14 |
18 | LPM R14, Z |
19 | mov ZL, R15 |
20 | LPM R15, Z |
21 | mov ZL, R16 |
22 | LPM R16, Z |
23 | mov ZL, R17 |
24 | LPM R17, Z |
25 | ret |
Ohne alignemt waeren die lookups deutlich langsamer. Oder gibt einen aehnlich effizienten Weg?
1 | .org pc + 0x7F & 0xFF80 ;alignment |
Wie genau funktioniert das Alignment aus diesem Beispiel, insbesondere PC? Ich haette nicht erwartet das man PC zusammen mit .org benutzen darf.
Bastler schrieb: > Ohne alignemt waeren die lookups deutlich langsamer. Das bezweifelt keiner. Aber wie lange dauert dann das, was Du mit R10..R17 danach machst? Und wieviel Zeit ist bis zum nächsten Aufruf? Wenn ich einen Funktionsteil um 50% kürze, heißt das noch lange nicht, daß das gesamte Programm doppelt so schnell läuft. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.