MSP430 - uIP mit IAR compilieren

OP #922435
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.
Gast #924911
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.
Gast #925001
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
OP #925964
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
Gast #926270
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

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.

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.