Forum: Mikrocontroller und Digitale Elektronik Softune Problem beim Datenzugriff über einen Struct


von Matthias K. (mohv)


Angehängte Dateien:

Lesenswert?

Guten Tag

Erstmal vielen Dank an alle die hier immer so viele nützliche Beiträge 
posten. Ich suche schon seit Jahren immer in diesem Forum wenn ich nicht 
weiter komme. Leider habe ich diesemal keine Lösung gefunden.

Also mein Problem ist das ich versuche eine Software die ich mal vor 
Jahren auf einem AVR geschrieben habe auf einem Fujitsu MB96F326 zum 
laufen bringen will. Jedoch ist der Softune Workbench lange nicht so gut 
wie das WINAVR.

So nun zu meinem Problem:

Wenn ich versuche über eine Struct auf eine Speicherbereich zuzugreifen 
kommt es dazu das einzelne Bytes übersprungen werden. Es sieht so aus 
als ob Softune nicht in der Lage ist bei 16Bit variablen auf ungerade 
Speicherbereiche zuzugreifen und dann immer ein Byte überspringt. Im 
anhang ist eine Testfunktion mit dem endsprechenden ausgaben.

Wenn jemand eine Idee hat wäre ich sehr dankbar.

Gruß Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias Krause schrieb:

> So nun zu meinem Problem:
>
> Wenn ich versuche über eine Struct auf eine Speicherbereich zuzugreifen
> kommt es dazu das einzelne Bytes übersprungen werden.


  unsigned char SDKartenDaten[16] = {  0x00, 0x11, 0x22, 0x33,
                    0x44, 0x55, 0x66, 0x77,
                    0x88, 0x99,  0xAA, 0xBB,
                    0xCC, 0xDD, 0xEE, 0xFF};

  struct StructTest
  {
    char    sc_1;  // 1
    unsigned int  ui_2;  // 3
    unsigned char  uc_3;  // 4
    char    sc_4;  // 5
    unsigned int  ui_5;  // 7
    int    si_6;  // 9
    unsigned char  uc_7;  //10
    unsigned int  ui_8;  //12
    int    si_9;  //14
    unsigned char  uc_10;  //15
    unsigned char  uc_11;  //16
  };

  struct StructTest *StTest;
  StTest=(struct StructTest *)SDKartenDaten;


Autsch

> Es sieht so aus
> als ob Softune nicht in der Lage ist bei 16Bit variablen auf ungerade
> Speicherbereiche zuzugreifen und dann immer ein Byte überspringt.

Dein Compiler hat zwischen die Member an manchen Stellen sog. Padding 
Bytes eingefügt um alle Member (vermutlich) auf eine gerade Startadresse 
zu bekommen. Bei einigen Prozessoren ist es so, dass man auf Worte an 
geraden Adressen schneller zugreifen kann, als an ungeraden Adressen. 
Daher sieht der Compiler zu, dass er eine Struktur so auslegt, dass auf 
alle Member schnell zugegriffen werden kann.

> Wenn jemand eine Idee hat wäre ich sehr dankbar.

Doku nachlesen, ob überhaupt und wenn ja wie, du für eine Struktur das 
Padding abschalten kannst.
Meist sind das irgendwelche speziellen Schlüsselworte im Zusammenhang 
mit struct. Manchmal ist es auch ein #pragma mit welchem man hier zum 
Zug kommt.

von Matthias K. (mohv)


Lesenswert?

Hi

Vielen Dank. Ich habe mal etwas getestet und du hast recht. Des size des 
Struct sollte ja eigentlich 16 sein. Er ist aber 18. Somit ist klar das 
da noch zwei Padding Bytes hinzugefügt wurden.

Nur leider finde ich nichts dazu wie man das Padding bei Softune 
deaktivieren kann. Hat das vieleicht schon mal irgendjemand gemacht?

Gruß Matthias

von holger (Gast)


Lesenswert?

>Nur leider finde ich nichts dazu wie man das Padding bei Softune
>deaktivieren kann. Hat das vieleicht schon mal irgendjemand gemacht?

Steht bestimmt im Handbuch.

Oder sortier deinen Scheiß doch mal anders

  struct StructTest
  {
    unsigned int  ui_2;  // 3
    unsigned int  ui_5;  // 7
    int    si_6;  // 9
    unsigned int  ui_8;  //12
    int    si_9;  //14
    char    sc_1;  // 1
    unsigned char  uc_3;  // 4
    char    sc_4;  // 5
    unsigned char  uc_7;  //10
    unsigned char  uc_10;  //15
    unsigned char  uc_11;  //16
  };

von Matthias K. (mohv)


Lesenswert?

Hallo

Das mit dem Handbuch ist Bei Fujitsu so eine Sache für sich. Na ja ich 
werde mal suchen und wenn ich was finde werde ich es auch hier rein 
schreiben.

Die Idee mit dem anders sortieren ist super. Leider ist das ja nur ein 
Testprogram. Meine eigentlichen Anwendung ist es ein SD Karte mit einem 
Fat Datensystem auf dem Fujitsu zu implementieren. Leider kann ich mir 
nicht aussuchen wie die Daten im MBR auf der SD Karte abgelegt sind.

An ja wenn ich keine Lösung finde muss ich wohl die gesammten Funktionen 
umschreiben. Das wollte ich jedoch geren umgehen.

Gruß Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias Krause schrieb:

> An ja wenn ich keine Lösung finde muss ich wohl die gesammten Funktionen
> umschreiben. Das wollte ich jedoch geren umgehen.

Schreib sie um.
Das mit der "Struktur über die Daten legen" ist eh nicht so der 
Bringern.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Karl heinz Buchegger schrieb:

> Schreib sie um.
> Das mit der "Struktur über die Daten legen" ist eh nicht so der
> Bringern.

Hallo, diese Erfahrungen habe ich auch gemacht. Ich arbeite mit MB90F334 
(16bit) und MB91F467 (32bit) bei mit Softtune. Hab es mit "dummys" 
zwischen den einzelnen Werten hingebogen. Es funktioniert aber 'schön' 
ist was anderes. Was wäre denn die Alternative?

mfg Rene

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.