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?
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).
byteweise funktioniert nicht. Es handelt sich hierbei um ein Backup-RAM.
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.
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).
Kann immer nur ein ELement @ 32bit beschreiben. Also kein byteweiser Zugriff.
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.
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
Irgendwie ist bei mir der Wurm drin. Ich weiß nicht wie ich die Union für meine Anwendung nutzen könnte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.