www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 - uIP mit IAR compilieren


Autor: Konstantin R. (kribel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Seit Tagen verusche ich nun das uIP Projekt auf einen MSP430FG4619 zu 
portieren. Die Treiber habe ich soweit geschrieben. Daten können 
empfangen und gesendet werden. Ich arbeite mit dem IAR C/C++ Compiler 
for MSP430
V4.11A/W32 [Kickstart] (4.11.1.3). Mit diesem kann ich bis 8KB 
compilieren.

Die uIP Software habe ich vom MSP430 uIP Port Projekt. Ich habe 
lediglich die Treiber geändert da ich mit einem anderen 
Ethernetcontroller arbeite.

Ein Problem habe ich noch, undzwar wird folgendes definiert:
/**
 * Representation of a 48-bit Ethernet address.
 */
struct uip_eth_addr {
  u8_t addr[6];
};

/**
 * The Ethernet header.
 */
struct uip_eth_hdr {
  struct uip_eth_addr dest;
  struct uip_eth_addr src;
  u16_t type;
};


#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

Da type ein Integer ist, macht mir das Ding Probleme. Wenn ich jetzt mit
BUF->type = ....
auf das Struct zugreife, werden die Arrayfelder 11 und 12 statt 12 und 
13 bearbeitet.

Kennt jemand das Problem bzw. weis jemand wie man es beheben kann?

Ich danke euch im Voraus.

Gruß
Konstantin

PS.: Die Beiträge MSP430 uIP Port und MSP430 habe ich mir schon 
durchgelesen und nichts gefunden.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht so aus als ob das Byte Array an einer ungeraden Adresse startet. 
Beim cast auf Int wird dann die gerade Adresse benutzt.

Schau mal nach Data Alignment im IAR Compiler Handbuch!!

Information an welcher Adresse das Struct (und seine Elemente) liegt 
wäre auch von Nutzen.

Autor: odic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem Alignment solltest du "eigentlich" keine Schwierigkeiten haben, 
solange du nicht mittels Pointerarithmetik auf einzelne Strukturelemente 
zugreifst. In diesem Fall müßtest du vom Compiler eingefügte Füllbytes 
kennen und beachten. (Ich fülle auf diesem Grund meine Strukturen immer 
händisch auf.)

Der Zugriff wie du ihn machst sollte "eigentlich" vom Compiler korrekt 
gehandhabt werden, insbesondere da du ja nur vielfache von 16Bit in 
deiner Struktur hast. Einzige Ausnahme wie von Bernhard beschrieben: die 
komplette Struktur wird falsch aligned. Ein Blick ins Linker-file müßte 
dir da auch weiterhelfen.

Verständnisfrage: Ist uip_buf ein Array aus Instanzen der Struktur 
uip_eth_hdr bzw. wenn ja, wozu dient der cast in dem define?

Grüße,
odic

Autor: Konstantin R. (kribel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich danke euch für eure Antworten.

Ich habe mich mit IAR in Verbindung gesetzt. Folgendes musste in der 
uip.c geändert werden:
#pragma data_alignment=2
u8_t uip_buf[UIP_BUFSIZE + 2];

Hier ist die zitierte Antwort von IAR:
"This has to do with that we allow char/byte objects (including array of 
bytes) to be allocated at odd addresses.  We allow this since the 430 
has not that much RAM by default.  I am pretty sure that e.g. the GNU 
compiler aligns all global objects on even addresses, thus wasting some 
RAM."

Jetzt funktioniert alles Einwandfrei.

Gruß
Konstantin

Autor: odic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessante Philosophie.... es funktioniert zwar nicht, ist aber schön 
klein.. Und gleich mal gegen die GCC gewettert.... ;-)

Naja, hauptsache es funktioniert jetzt. Wobei sich das bestimmt auch 
sectionsweise festlegen läßt.
Sonst könntest du so nette Effekte haben wie ich mal auf einem MPC: du 
fügst irgendwo eine Variable ein, die eigentlich gar keinen Einfluß 
haben kann, und dein Programm funktioniert nicht mehr. Du fügst wieder 
eine ein, und es funktiniert wieder.... und so weiter....

Beste Grüße,
odic

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.