Speicherzugriff mit Pointer

OP #2838609
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
#2838634
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.
Persönliche Seite #2838653
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.

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.