8bit Speicheralignment im 32bit kontroller

Gast #2581638
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
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...
Gast
>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
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)
Gast
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?
Gast
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);
..

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.