Forum: Mikrocontroller und Digitale Elektronik Pointer auf Struct und Textausgabe


von LightCo (Gast)


Lesenswert?

Hallo,
ich benutze den LPC2138 µP und habe folgendes Problem:
Ich möchte einen Text aus der Struktur auslesen und weiß nicht wie:

Ich habe eine Struktur:
typedef struct {
    INT8U ZAHL;
    INT8U NAME[128];
    INT8U DESCRIPTION[128];
    INT8U TYPE[128];
}flash;

einen Pointer auf diese
flash *ptr;
dann noch eine Adresszuweisung der Struktur auf eine Adresse imm 
internen Flash
ptr = (flash*) 0x00070000;

wenn ich aus dem Flash dann lesen möchte:
i= flash->ZAHL; alles OK
ich habe ein Problem damit das array auszuwerten in dem ein Tex´t steht.

Was muß ich beachtet? kann mir da jemand helfen?

von Rüdiger K. (sleipnir)


Lesenswert?

Was sind denn das für Probleme? Nimmt der Compiler flash.name nicht für 
Zeichenkettenverarbeitende Routinen an? Dann versuch doch statt UINT8 
den Datentyp char zu verwenden! Oder Du mußt
 a) die Zeichenketten als Union definieren
  struct {
    union
    {
     char  s[128];
     UINT8 i[128];
    }name;
  }flash;
 oder b)
 einen Typcast machen:
  (char *) &flash.name[0]

 Beachte auch das die meisten zeichenkettenverarbeitenden Routinen in C 
0-terminierte Zeichenketten erwarten! (D.h. letzter Wert muß 0 sein!)

von Karl H. (kbuchegg)


Lesenswert?

LightCo wrote:

Wie ist das beim LPC2138?
Hat der eine Harvard Architektur?

> wenn ich aus dem Flash dann lesen möchte:
> i= flash->ZAHL; alles OK
> ich habe ein Problem damit das array auszuwerten in dem ein Tex´t steht.
>

Was hast du probiert?

> Was muß ich beachtet? kann mir da jemand helfen?

Vermutung: Ich könnte mir vorstellen, dass ein normales
strcpy() nicht dafür ausgelegt ist, die Zeichen aus dem
Flash Speicher zu holen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der ARM7TDMI im LPC2138 hat eine von-Neumann-Architektur; bei 
Lesezugriffen auf das Flashrom ist exakt genauso zu verfahren wie bei 
Zugriffen auf das RAM.

Mit einem Typecast sollte das Problem lösbar sein:
1
typedef struct {
2
    INT8U ZAHL;
3
    INT8U NAME[128];
4
    INT8U DESCRIPTION[128];
5
    INT8U TYPE[128];
6
} flash;
7
8
flash *ptr;
9
10
ptr = (flash*) 0x00070000;
11
12
printf("%s\n", (char *) (ptr->NAME));

(anstelle von printf ist die gewünschte Stringoperation zu wählen).

> wenn ich aus dem Flash dann lesen möchte:
> i= flash->ZAHL; alles OK

Das ist es unter Garantie nicht,

  i = ptr->ZAHL;

funktioniert. "flash" ist keine Variable, sondern ein Datentyp. Aber ich 
vermute, daß Du Dich eh nur vertippt haben wirst.

[Nachtrag]
An der Adresse 0x70000 liegt auch Flashrom? Mit sinnvollem Inhalt?

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly wrote:
> Der ARM7TDMI im LPC2138 hat eine von-Neumann-Architektur; bei
> Lesezugriffen auf das Flashrom ist exakt genauso zu verfahren wie bei
> Zugriffen auf das RAM.

Ah. OK.

>
> Mit einem Typecast sollte das Problem lösbar sein:
>
> [c]typedef struct {
>     INT8U ZAHL;
>     INT8U NAME[128];
>     INT8U DESCRIPTION[128];
>     INT8U TYPE[128];
> } flash;

Wobei ich mich sowieso frage, aus welchem Grund ich ein
String-Array als INT8U[] (was immer das auch sein mag)
definieren sollte und nicht einfach als char[].

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.