Forum: Mikrocontroller und Digitale Elektronik Speicherzugriff mit Pointer


von Lars D. (eitum)


Lesenswert?

Hallo,

Ich hab ein kleines Problem mit dem Speicherzugriff mittels pointer.

Ich habe eine Struktur die ich auf ein EEPROM Speichern möchte. Anstatt 
jetzt jedes Structurelement einzeln in uChar zu zerlegen und in einem 
Array abzuspeichern hatte ich mir überlegt einfach mittels eines 
Char-pointers durch das Array "zu wandern"
1
typedef struct
2
{
3
  UINT16  Cycle_Count;
4
  UINT16  Completed_Cycles;
5
  float    cal_value;
6
  UINT16  Actual_Page;
7
  UINT8    Page_Position;
8
} system_type;
9
10
system_type  System;
11
12
UINT16  Address  =  0;
13
UINT16  Length   =  0;
14
15
UINT8  *pTransmit  =  0;
16
UINT8  *pReceive   =  0;
17
UINT8  *pAddress   =  0;
18
19
void fnStoreSystemValues  (void )
20
{
21
  Target    =  WRITE_SYSTEM;
22
  Address   =  0x55AA;
23
  pAddress  =  UINT8 *) &Address;
24
  pTransmit =  (UINT8*) &System.Cycle_Count;
25
  Length    =  sizeof(System);
26
  Addressing_Flag =  1;
27
  IE2       =  UCB0TXIE;        /* USCI_B0 transmit interrupt enable */
28
  UCB0CTL1 |=  UCTR + UCTXSTT;  /* start condition I2C transmit */
29
  while (UCB0STAT & UCBBUSY);
30
}

In der ISR mach ich dann (unter anderem)
1
 UCB0TXBUF   =  *pAddress;
2
 IFG2  &=   ~UCB0TXIFG;   // USCI_B0 clear transmit interrupt flag
3
 Address_length--;
4
 if (Address_length != 0)
5
 {
6
   pAddress++;
7
 }

Der Pointer zeigt zwar auf die richtige Adresse, aber wenn ich mir am 
Ozsi anschaue was übertragen wird bewegt sich der Pointer 
folgendermaßen:

0x55AA wird nicht wie erwartet als 0x55 und 0xAA übertragen sondern als 
0xAA und 0x55.

Ich hab jetzt schon mehrere Einstellungen probiert aber keine Lösung 
gefunden.

Bei den Daten wäre es mir egal, da es sich beim zurück lesen wieder 
aufheben würde, leider wird so auch die Adresse verstellt.
Gibt es dafür eine Lösung?  z.b. Bytereihenfolge angeben oder so?

Danke im voraus

von XXX (Gast)


Lesenswert?

Hallo

Such mal in google nach
"big endian" und "little endian".

Gruß
Joachim

von Thomas E. (thomase)


Lesenswert?

Lars D. schrieb:
> 0x55AA wird nicht wie erwartet als 0x55 und 0xAA übertragen sondern als
> 0xAA und 0x55.
Das ist richtig.
Wenn ein 16-Bit-Wert abgespeichert wird, wird das niederwertige Byte an 
der niedrigeren Adresse abgespeichert.
Im Speicher steht dann:
Adr0  0xAA
Adr1  0x55

Das nennt sich Little Endian.

Es gibt auch Systeme, bei denen ist das andersrum. Das ist Big Endian.

mfg.

von Lars D. (eitum)


Lesenswert?

Danke für die schnellen Antworten,  gibt es eine Möglichkeit den Zugriff 
zuändern?

Ich nutze einen MSP430F2272.

von Thomas E. (thomase)


Lesenswert?

Lars D. schrieb:
> gibt es eine Möglichkeit den Zugriff  zuändern?
Ja. Indem du einen Controller nimmst, bei dem das anders ist.
Warum willst du das ändern?
Du weisst jetzt wie es richtig ist und worauf du achten musst.

mfg.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lars D. schrieb:
> Danke für die schnellen Antworten,  gibt es eine Möglichkeit den Zugriff
> zuändern?

Ja, einen anderen µC verwenden.

Im Ernst: Die Reihenfolge, in der die einzelnen Bytes eines 16-Bit-Werts 
im Speicher abgelegt werden, sind von der Hardwarearchitektur des 
verwendeten Prozessors vorgegeben, wenn Du das anders haben willst, 
musst Du entweder Dein Programm anpassen oder aber einen Prozessor mit 
passender Architektur verwenden.

Hier ist es wohl ausreichend, Deine Adressübertragungsvariante in der 
ISR anzupassen, so daß das von Dir gewünschte Verhalten auftritt.

von Lars D. (eitum)


Lesenswert?

Danke für die Antworten

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.