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


von Konstantin R. (kribel)


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:
1
/**
2
 * Representation of a 48-bit Ethernet address.
3
 */
4
struct uip_eth_addr {
5
  u8_t addr[6];
6
};
7
8
/**
9
 * The Ethernet header.
10
 */
11
struct uip_eth_hdr {
12
  struct uip_eth_addr dest;
13
  struct uip_eth_addr src;
14
  u16_t type;
15
};
16
17
18
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

Da type ein Integer ist, macht mir das Ding Probleme. Wenn ich jetzt mit
1
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.

von Bernhard (Gast)


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.

von odic (Gast)


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

von Konstantin R. (kribel)


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:
1
#pragma data_alignment=2
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

von odic (Gast)


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

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.