Forum: Mikrocontroller und Digitale Elektronik Copy struct to uint32_t array


von Max (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem.
Der Mikrocontroller den ich nutzte hat einen speziellen RAM Bereich mit
jeweils 32bit x 32.
Ich kann das RAM nur mit RAM->Ret[0].Ret = 0x12345678 beschreiben.
Das wäre quasi das erste Element.

Ich habe nun eine Struktur mir unterschiedlichen Variablen (uint8_t, 
uitn16_t). Diese Daten von der Struktur soll dann in das RAM kopiert 
werden.
Da ich nur elementweise auf das RAM zugreifen kann, kann ich hierfür 
memcpy nutzen?

von STK500-Besitzer (Gast)


Lesenswert?

Max schrieb:
> Da ich nur elementweise auf das RAM zugreifen kann, kann ich hierfür
> memcpy nutzen?

Kommt auf deinen Controller an.
Wenn der auch eine byteweise Adressierung für den Bereich zulässt, geht 
das.
Bei machen geht es nicht (z.B. Backup-RAM der STM32F4-RTC).

von Max (Gast)


Lesenswert?

byteweise funktioniert nicht. Es handelt sich hierbei um ein Backup-RAM.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hängt von der unbekannten Architektur ab.

Mindestvoraussetzung für memcpy ist:

1) Der Speicher ist byteweise adressierbar.

2) Es macht keinen Unterschied, ob der Speicher von vorne nach hinten 
oder von hinten nach vorne beschrieben wird.

3) Schreiben auf den Speicher hat keine Seiteneffekte.  In C Speek: Der 
Speicher ist nicht volatile.

Falls eine der Bedingungen nicht erfüllt ist, kann Funktionieren 
anhängig sein von der konkreten Implementation von memcpy.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Max schrieb:
> byteweise funktioniert nicht.

Dann nimm einen "normalen" Speicher, kopiere mit memcpy dorthin, und 
dann (händisch) in 32-Bit Happen in den Bit-Speicher.

Evtl. kann auch direkt vom ursprünglichen Ojbekt in 32-Bit Happen 
kopiert werden, kann aber von Alignment abhängig sein, und 
sozeof(Objekt) sollte teilbar sein durch sizeof(uint32_t).

von Max (Gast)


Lesenswert?

Kann immer nur ein ELement @ 32bit beschreiben. Also kein byteweiser 
Zugriff.

von STK500-Besitzer (Gast)


Lesenswert?

Max schrieb:
> byteweise funktioniert nicht.

Auslesen, modifizieren und wieder zurückschreiben.

Max schrieb:
> Ich habe nun eine Struktur mir unterschiedlichen Variablen (uint8_t,
> uitn16_t).

Wie sieht die genau aus?

Ansonsten: in eine uin32_t-Variable auslesen, die Werte modifizieren und 
wieder zurückschreiben.

Dazu kann man gur "union" verwenden.

von Max (Gast)


Lesenswert?

Bin da echt überfragt wie das ganze umsetzen soll.

von STK500-Besitzer (Gast)


Lesenswert?

Max schrieb:
> Bin da echt überfragt wie das ganze umsetzen soll.
1
union hilfe
2
{
3
   struct bla
4
   {
5
        uint16_t wordVariable;
6
        uin8_t   byteVariable
7
        // Platz für noch ein Byte
8
   }
9
   uint32_t dwordVariable;
10
}
11
hilf.dwordVariable = Inhalte der Backup-Speicherzelle;
12
hilf.bla.wordVariable = 16BitWert;
13
hilf.bla.byteVariable = 8BitWert;
14
Inhalte der Backup-Speicherzelle = hilf.dwordVariable;

Auf hilf.bla kannst du auch natürlich per memcpy zugreifen.
Je nach Controller-Architektur brauchst du vielleicht noch ein 
"#pragma(push,4)" oder so

von Max (Gast)


Lesenswert?

Ich danke dir schonmal

von Max (Gast)


Lesenswert?

Irgendwie ist bei mir der Wurm drin. Ich weiß nicht wie ich die Union 
für meine Anwendung nutzen könnte.

von mIstA (Gast)


Lesenswert?

Max schrieb:
> Ich habe nun eine Struktur mir unterschiedlichen Variablen
> (uint8_t, uitn16_t).

Hast Du in Deiner Struktur mehr als 32 unterschiedliche Variablen?
Wenn nicht, dann kannst Du einfach für jedes Element Deiner struct eine 
eigenes 32-Bit RAM-Array-Element verwenden.
Nur wenn Du mehr als 32 Elemente (oder einzelne Elemente die nicht in 
jeweils 32-Bit passen) in Deiner struct hast wirds komplizierter.

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.