Hallo, kann mir bitte jemand erklären wie die folgende Behaptung begründet ist? "Die Reihenfolge der einzelnen Daten- und Adresspins am RAM kann nach Belieben variiert werden, wenn dadurch das Layout der Platine vereinfach wird." Der Satz stammt von hier http://www.mikrocontroller.net/articles/Speicher#SRAM Trifft dies auch zu wenn der Speicher an den Speicher eines µC gemappt wird? Grüße
Hi >Trifft dies auch zu wenn der Speicher an den Speicher eines µC gemappt >wird? Ja. MfG Spess
beavis schrieb: > nn mir bitte jemand erklären wie die folgende Behaptung begründet ist? > > "Die Reihenfolge der einzelnen Daten- und Adresspins am RAM kann nach > Belieben variiert werden, wenn dadurch das Layout der Platine vereinfach > wird." Begründung: die veränderte Reihenfolge kannst du sehr einfach im Programm per #define anpassen.
Tausche A15 mit A0 => Das Byte an 0x8000 stünde dann im Chip auf 0x0001. Ist aber egal, weil wenn der Controller nach dem Byte an 0x8000 frage, wird durch das Vertauschen das automatisch auf 0x0001 "übersetzt". Selbiges gilt für das Byte, das der Controller auf 0x0001 erwarten würde - durch das Vertauschen wird aus der Controller-Adresse 0x0001 die Chip-Adresse 0x8000. Das geht bei jedem Speicher.... Solange der Controller selber die Daten reinschreibt, die er später liest, ists egal. Willst du ein Programm in den Flash/EEPROM/... extern reinladen (JTAG/...) und der Controller liests dann mit einem "durchmischten Adressbus" aus gibts natürlich Probleme. 73
Micha schrieb: > beavis schrieb: >> nn mir bitte jemand erklären wie die folgende Behaptung begründet ist? >> >> "Die Reihenfolge der einzelnen Daten- und Adresspins am RAM kann nach >> Belieben variiert werden, wenn dadurch das Layout der Platine vereinfach >> wird." > > Begründung: die veränderte Reihenfolge kannst du sehr einfach im > Programm per #define anpassen. Schwachsinn.
Jede Speicherzelle ist gleichwertig. Es ist also egal, wo Du ein Bit hinschreibst, es wird auch immer von dort gelesen. Es sei denn, Du verdrahtest zwischen Schreiben und Lesen um, ohne die VCC abzuschalten. Peter
@ beavis (Gast) >kann mir bitte jemand erklären wie die folgende Behaptung begründet ist? >"Die Reihenfolge der einzelnen Daten- und Adresspins am RAM kann nach >Belieben variiert werden, wenn dadurch das Layout der Platine vereinfach >wird." Ganz einfach. Einfacher SRAM hat keine sequentielle Logik im Inneren, einfach Adresse und Daten anlgen, WR-Puls, fertig. Lesen dito. Wenn man nun Datenleitungen vertauscht, landet z.B. D0 vom Mikrocontroller auf D5 des SRAM beim Schreiben. So what! Denn beim Lesen ladet eben dieses D5 wieder bei D0 vom Mikrocontroller. Bei Adressen ist es ähnlich. Wenn man beispielsweise A0 mit A7 vertauscht, dann landet die Adresse 0x01 im SRAM auf 0x80. Beim Lesen wird das aber wieder zurück"gedreht". >Trifft dies auch zu wenn der Speicher an den Speicher eines µC gemappt >wird? Sicher, woran soll er den sonst gemappt sein? Das Ganze geht aber nicht mit IO-gemappten Chips wie CAN-Tranceiver etc., denn dort muss alles 1:1 stimmen. MFG Falk
Falk Brunner schrieb: > Das Ganze geht aber nicht mit IO-gemappten Chips wie CAN-Tranceiver > etc., denn dort muss alles 1:1 stimmen. Du musst nur die Software entsprechend anpassen. ;-)
Moin, Man kann sogar auch EPROM/FLASH so anschließen, wenn man deren Inhalt entsprechend vorbehandelt. Ich hab vor Jahren mal ein EPROM ausgelesen, das mit vertauschen Datenleitungen angeschlossen war. Um das rückzutauschen, hab ich folgendes kleine Skript geschrieben:
1 | #!/usr/bin/perl -w
|
2 | # permute bits in a binary EPROM image
|
3 | |
4 | my @bit = ( 1, 2, 4, 8, 16, 32, 64, 128 ); |
5 | |
6 | my $pattern= shift or die "usage: $0 pattern <infile >outfile |
7 | pattern must be a permutation of (0..7)\n"; |
8 | my @pattern= split '', $pattern; |
9 | |
10 | my $c; |
11 | while (defined($c= getc)) { |
12 | my $input = ord $c; |
13 | my $output = 0; |
14 | for (my $i= 0; $i < 8; ++$i) { |
15 | if ($input & $bit[$i]) { |
16 | $output |= $bit[$pattern[$i]]; |
17 | }
|
18 | }
|
19 | printf "%c", $output; |
20 | }
|
21 | exit 0; |
Beispiele: bitpermute 01234567 <infile >outfile ... verändert nix bitpermute 01534267 <infile >outfile ... tauscht Bits 5 und 2 bitpermute 45670123 <infile >outfile ... tauscht L- und H-Nibble bitpermute 76543210 <infile >outfile ... reversed die Bits etc. Ein- und Ausgabe-File müssen binär sein (.bin, kann man mit entsprechenden Tools von/nach .hex wandeln). Eignet sich auch gut zur Obfuscation :) XL
Bei Flash oder EEPROM sollten aber die unteren Adreßbits stimmen, sonst geht Page-Write nicht mehr. Auch müssen alle Kommandos umkodiert werden. Peter
Aus dem Artikel "ACHTUNG, das geht nur bei einfachen SRAMs. DRAM oder neuere Speicher nehmen das fix übel, weil die Ansteuerung durcheinander kommt (Adressmultiplexing, Pagemodus, Byteslanes bei DDR-RAM etc.). Bei diesen ICs kann man bestenfalls Datenleitungen tauschen, bei DDR-RAMs nur innerhalb einer Byte-Lane. Prinzipiell sollte man davon aber nur sparsam Gebrauch machen, wenn es dem Layout wirklich hilft. "
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.