PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ISO Norm für Adressierung von Speicher ?



Newbie314
27.11.13, 09:47
Hi !

Bei uns hat sich gerade herausgestellt dass zwei an einem Projekt beteiligte Gruppen die Speicheradressen unterschiedlich "zählen".

Die eine zählt bytes und kann dann wenn die kleinste adressierbare Speichereinheit z.B. 16 bit ist nur jedes zweite Byte überhaupt ansprechen, die andere zählt "words", d.h. der nächsthöhere Zählerstand gibt dann das nächste 16 Bit Word an.

Die beiden Gruppen müssen sich auf eine gemeinsame Schreibweise einigen: gibt es dazu vielleicht eine internationale Norm ? Per Google fand ich nichts, Wikipedia geht auch nicht darauf ein.. vielleicht hatte jemand hier in seiner Ausbildung von einem Standard gehört ?

(Worauf die sich einigen ist mir eigentlich schnurz, aber sollte es eine Norm geben hätte ich gerne eine Einigung die dieser entspricht...)

jay-t
27.11.13, 16:08
Ich bin kein Informatiker und kenne auch keine ISO Norm dazu.
Macht doch einfach was eher Sinn ergibt, d.h. wenn ihr als kleinste Einheit Bytes verwendet dann nehmt Bytes zum Zählen.

Über irgendwelche "Normen" wie man so was machen sollte habe ich mir als Hobbyprogrammierer noch nie nen Kopf gemacht. Da habe ich eher was mit Standards wie HTTP oder so was zu tun.

Manchmal musste ich auch selbst was entwickeln was es so vorher nicht gab.
Hauptsache das was man macht passt für den Einsatzzweck.

Ist jetzt wohl nicht die Antwort geworden die Du haben wolltest...

nopes
27.11.13, 17:26
Hallo,

auch ich kann dir hier keinen Standard nennen. Allerdings, wenn ihr nicht total weit unter der Haube arbeitet, stellt sich die Frage, wofür ihr das braucht. Was passiert wenn auf einmal 32 oder gar 64 Bitter mit spielen?
Die eine zählt bytes und kann dann wenn die kleinste adressierbare Speichereinheit z.B. 16 bit ist nur jedes zweite Byte überhaupt ansprechen. Ist das garantiert? Glaube nicht das man das kann, außer vielleicht man verwendet Sprachen die ohne Pointer auskommen; solche Sprachen zeichnen sich auch dadurch aus, dass Typklarheit vorliegt (wie viel bit hat ein int in c; man weiß es einfach nicht). Die Lösung sind also eigene Typen, die gefälligst von beiden verwendet werden, dann sind so Sachen jedenfalls etwas sicherer:
void whatEver(my_byte *buffer)
{
my_byte *pos = buffer;
my_uint8 v1;
my_uint16 v2;
//...
memcpy(&v1, pos, sizeof(my_uint8));
pos += (sizeof(my_uint8)/sizeof(my_byte));
memcpy(&v2, pos, sizeof(my_uint16));
pos += (sizeof(my_uint16)/sizeof(my_byte));
//...
}Oder verstehe ich dich gerade völlig falsch?

ThorstenHirsch
27.11.13, 17:37
Was ist denn das Problem? Man kann doch beides umrechnen ins jeweils andere. Lass doch jede Gruppe das zählen, was sie lieber wollen. ...solange jeder die Einheit dazu schreibt.

P.S.: Was habt ihr denn für ein merkwürdiges System, bei dem nicht jedes Byte adressierbar ist? Bei den heutigen 64bit-Systemen hat man 64bit words, aber kann trotzdem jedes Byte adressieren. Wieso geht das bei eurer 16bit-Plattform nicht?

edit: Ich hab' das Sternchen wieder gelöscht - da hatte ich wohl word mit long verwechselt.

edit2: Ach herrje, das kann man ja gar nicht so pauschal sagen. Mein Handy hat 32bit words, mein Computer nur 16bit. Ist ja schrecklich. (http://en.wikipedia.org/wiki/Word_%28computer_architecture%29)

Aqualung
27.11.13, 18:34
Mit Endianess habe ich mich schon lange rumgeärgert (SUN vs Linux vs Windozen vs etc. pp). Vllt. hilft Dir

http://de.wikipedia.org/wiki/Byte-Reihenfolge

Newbie314
27.11.13, 21:08
.. das hat geholfen.

Für mich kommt da raus:

- es gibt keine Norm, jeder macht was für ihn Sinn macht
- im Gegensatz zu dem was ich dachte können moderne Computer also jedes Byte addressieren, nicht nur Word für Word (und müssten dann die überflüssig eingelesenen Bytes "wegwerfen")

... das spricht für die Variante der einen Gruppe, die müsste dann Informatikern die neu dazukommen "eingängiger" sein (daher die Frage).

Und ja, wir müssen uns einigen da wir ein Projekt gemeinsam auf die Beine stellen und uns sonst über Jahre hinweg mit Missverständnissen rumärgern werden- das Verständnis ist auf beiden Seiten da...

Programmiersprachen sind übrigens C und Assembler.. also relativ maschinennah.


Endianness- darüber lachen wir hier nur noch weil der verwendete Computer die eine, die diversen seriellen Schnittstellen die andere Reihenfolge verwenden. Mittlerweile haben wir das intus...

derguteweka
27.11.13, 21:47
Moin,

Ich wuerde mit Bytes als Einheit arbeiten. In C liefer sizeof() die Ergebnisse in Bytes zurueck. In Assembler kommts halt auf den Prozessor an, ich hab' mal vor 1000 Jahren mit einem TI-Graphikprozessor gearbeitet, der hat die Adresse in bit angegeben, aber das lief drauf raus, dass die letzten paar LSBs der Adresse dann doch nur 0 waren bei "normalen" Speicherzugriffen.
Wenn man ein FPGA mit externem DRAM hat (das ist dann noch eine Stufe "maschinen"naeher als Assembler) , laeufts auch auf Bytes raus - Die DRAMs haben, auch wenn sie breiter sind, immer WriteByteEnable Leitungen, oder sowas in der Art, z.B. bei 16-Bit DRAMs heissen die dann UDS und LDS (upper/lower data strobe). Das Lesen von Bytes ist nicht das Problem; die Adresszyklen sind da immer gleich. Das Schreiben ist das "bloede", denn dann muss verhindert werden, dass ungewollte Bytes des adressierten 16, 32, oder 64-Bit Worts geschrieben werden. Das geht eben ueber die WriteByteEnable-Leitungen...
Kurz: Auch wenn keiner eine Norm kennt, wuerd' ich stark zu Bytes als Einheit tendieren. Weils schon immer so war :ugly:

Gruss
WK

TheDarkRose
30.11.13, 11:46
Weil ein Byte als 8Bit festgelegt (meist) ist, aber ein Wort immer unterschiedlich ist -> Byte

Oder um es wie in den RFCs zu machen: Um ausdrücklich auf eine Anzahl von 8 Bit hinzuweisen, wird auch die Bezeichnung Oktett verwendet.