Copy struct to uint32_t array

Gast #7315033
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?

Gast #7315045
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).

Persönliche Seite #7315062
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.

Gast #7315076
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.

Gast #7315107
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

Gast #7315259
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren