Forum: Compiler & IDEs Tabellen im EEPROM organisieren


von Bastler (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

1
        .org    pc + 0x7F & 0xFF80              ;alignment

Karl hat recht, in der Praxis hat das keinen merkbaren Effekt.


Peter

von Bastler (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.