Forum: Mikrocontroller und Digitale Elektronik 8bit Speicheralignment im 32bit kontroller


von rennreh (Gast)


Lesenswert?

Hallo,

Ich habe einen 32bit Kontroller Arm Cortex M3 und stehe gerade vor dem 
Problem, dass ich 8bit Messwerte habe. Nun ist es so, dass der SPeiche 
rim Controller mit 64kB begrenzt ist. Das würde bedeuten, dass ich im 
controller maximal 16384 Messwerte Speichern kann? siehe dazu: n = 64kB 
* 1024 / 4 = 16384

Ist es möglich, dass ich dem C compiler durch verwendung von pragma pack 
/ pop das Speicheralignment auf 8bit reduzieren könnte um 4 mal mehr 
elemente zu speichern?

mfg

von (prx) A. K. (prx)


Lesenswert?

uint8_t array[4096] braucht 4KB RAM, egal ob auf einem 8, 16, 32, oder 
64-Bit Prozessor.

von ttl (Gast)


Lesenswert?

wenn dein compiler das kann ja, mit Keil geht es problemlos

von Uli T. (avaron)


Lesenswert?

Bei Byte-weisem Zugriff wirst Du kaum in allignment-Probleme kommen...
Wie oben gesagt:
1
uint_8t blafasel[zahl]

aufmachen und zugreifen :D

Zum überprüfen und sicher fühlen kannste Dir ja noch den sizeof ausgeben 
lassen...

von rennreh (Gast)


Lesenswert?

>uint8_t array[4096] braucht 4KB RAM, egal ob auf einem 8, 16, 32, oder
>64-Bit Prozessor.
Ok, das funktioniert auch ohne das pragma pack/pop?

aber ich verstehe jetzt nicht soganz wie die alu´s damit umgehen, 
schlißlich hat der m3 einen 16 und 32bit alu zu berechnung. der compiler 
kümmert sich um die aufteilung in 8bit werte und berechnet diese 
anschließend?

mfg

von Uli T. (avaron)


Lesenswert?

Ja, da kümmert sich der Compiler beim laden der register drum... 
Andersrum wirds komplizierter, also wenn Du mißalligned DWORDS oder so 
rumliegen hast... Auf die funktioniert dann nur einzel-byte-weißer 
zugriff (ist allerdings dann recht Prozessorabhängig, manche könnens 
auch mißalligned)

von rennreh (Gast)


Lesenswert?

fetzt vielen dank :)

eine frage nur noch; der speicher scheint adressmäßig zusammenzuhängen. 
hierbei besitzt mein controller 2 blöcke mit jeweils 32kB. ich brauch 
also nur ein zeiger vom typ uint8_t anzulegen und auf die anfangsadresse 
zu zeigen? durch zeigerarithmetik wie *mem = wert8bit;  mem++  (mem ist 
vom typ *uint8_t) fortlaufen auf den speicher schreiben?

von rennreh (Gast)


Lesenswert?

Ein Problem ergibt sich noch. ich benötige für meine berechnungen den 
datentyp float.


berechnung(float_t*mem) {
.. mach irgendwas ..
}


kann ich einfach mein uint8_t zeiger auf den float zeiger casten?
in der main:
..

uint8_t*mem = ADRESSE;

berechnung((float_t*)mem);
..

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.