Forum: Compiler & IDEs MSPGCC Fehler im CCS 6.0


von A. B. (brewnera)


Lesenswert?

Hallo zusammen,

ich habe die mspgcc toolchain installiert und verwende das Code Composer 
Studio 6.0. Als Testplattform verwende ich das MSP-EXP430G2 Launchpad 
mit dem MSP430G2231.

Wenn ich den TI Compiler wähle, der beim CCS dabei ist, funktionieren 
die Beispielprogramme für diesen uC problemlos. Wenn ich aber den GNU 
v4.8.0 (Red Hat) Compiler auswähle, kommt beim Build folgende 
Fehlermeldung:
1
error: ./main.o uses MSP430 instructions but c:/ti/ccsv6/tools/compiler/gcc_msp430_4.8.371/bin/../lib/gcc/msp430-elf/4.8.0/../../../../msp430-elf/lib/crt0.o uses MSP430X

Diesen Fehler konnte ich beheben, in dem ich die Target MCU (-mmcu) von 
"msp430" auf "msp430g2231" änderte.
Beim nächsten Build erscheinen dann andere Fehler:
1
LaunchTest.out section `.bss' will not fit in region `RAM'  
2
region `RAM' overflowed by 16 bytes  
3
gmake: *** [LaunchTest.out] Error 1  
4
gmake: Target `all' not remade because of errors.

Ich habe am Beispiel-Programm nichts geändert, sondern nur den Compiler 
geändert. Wenn ich eine ältere Version des gcc auswähle (GNU v4.6.3) 
kommen folgende Fehler:
1
error: no memory region specified for loadable section `.vectors'  
2
gmake: *** [LaunchTest.out] Error 1
3
gmake: Target `all' not remade because of errors.  
4
"__interrupt" redefined [enabled by default]  LaunchTest    line 72, external location: C:\TI\ccsv6\ccs_base\msp430\include_gcc\iomacros.h

Ich weiß absolut nicht mehr weiter, kann mir hier vielleicht jemand 
weiterhelfen?

Grüße,
Andí

: Verschoben durch Admin
von Ecki (Gast)


Lesenswert?

A. Brewner schrieb:
> Diesen Fehler konnte ich beheben, in dem ich die Target MCU (-mmcu) von
> "msp430" auf "msp430g2231" änderte.
> Beim nächsten Build erscheinen dann andere Fehler:
> LaunchTest.out section
> `.bss' will not fit in region `RAM'
> region `RAM' overflowed by 16 bytes
> gmake: *** [LaunchTest.out] Error 1
> gmake: Target `all' not remade because of errors.

Das hier könnte helfen:

http://forum.43oh.com/topic/5419-code-composer-studio-v6-now-officially-released/?p=47408

von iar user (Gast)


Lesenswert?

Zur ersten Fehlermeldung:
Es wurde Code mit dem Extended Befehlssatz generiert. Der passt nicht 
zum Controller. Mit der Auswahl des richtigen Target wurde das behoben.

Zur zweiten:
Das RAM hat bei den gewählten Projekt Einstellungen nicht gereicht. Du 
solltest das Linkersript mal prüfen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

iar user schrieb:
> Es wurde Code mit dem Extended Befehlssatz generiert.

Na, eigentlich andersrum. main.o ist "klassischer" MSP430, aber der 
Startup-Code, der dazugelinkt werden soll, ist MSP430X.

von Christian R. (supachris)


Lesenswert?

Kontrollier mal, ob bei den Linker Settings auch der korrekte -mmcpu 
Parameter gsetzt ist. Ansonsten ist wohl wirklich der Speicher voll.

von A. B. (brewnera)


Lesenswert?

Ecki schrieb:
> Das hier könnte helfen:
> 
http://forum.43oh.com/topic/5419-code-composer-studio-v6-now-officially->released/?p=47408

Ich hab das _start.S File zum Projekt hinzugefügt, allerdings weiß ich 
nicht genau was mit "Note: You will also have to move the '*(COMMON)' 
line from the .noinit section to the .bss section in your linker script 
file." gemeint ist. Die besagten sections sehen im msp430g2231.ld linker 
file so aus:
1
.bss : {
2
    . = ALIGN(2);
3
    PROVIDE (__bssstart = .);
4
    *(.dynbss)
5
    *(.sbss .sbss.*)
6
    *(.bss .bss.* .gnu.linkonce.b.*)
7
    . = ALIGN(2);
8
    PROVIDE (__bssend = .);
9
    _end = .;
10
    PROVIDE (end = .);
11
  } > RAM
12
  PROVIDE (__bsssize = SIZEOF(.bss));
13
14
  .noinit : {
15
    . = ALIGN(2);
16
    PROVIDE (__noinit_start = .);
17
    *(.noinit)
18
    . = ALIGN(2);
19
    *(COMMON)
20
    PROVIDE (__noinit_end = .);
21
    end = .;
22
  } > RAM
Wo genau soll ich die '*(COMMON)' Zeile hin verschieben?

Ich erhalte nach wie vor folgende Fehlermeldungen: siehe Bild.

Als Device ist der MSP430G2231 eingestellt. In den 
Compiler-Einstellungen (CCS Build > GNU Compiler > Runtime) ist 
standardmäßig unter -mcpu nichts eingetragen und unter -mmcu msp430. 
Wenn ich bei -mcpu 430 eintrage, bleiben noch vier Fehler:
1
region `RESETVEC' overflowed by 2 bytes       
2
gmake: *** [msp430g2xx1_1.out] Error 1       
3
msp430g2xx1_1.out section `__reset_vector' will not fit in region `RESETVEC'  
4
gmake: Target `all' not remade because of errors.

Im mspgcc manual 
http://mspgcc.sourceforge.net/manual/c745.html#compiler-options ist für 
die Option -mmcu "msp430" interessanterweise gar nicht vorhanden.

Wie gesagt, wenn ich einfach auf den TI compiler umschalte, funktioniert 
es problemlos. Der Speicher kann vom kleinen Programm unmöglich voll 
sein. Die Header-files sind auch die gleichen. Was kann den Speicher 
noch überfüllen?

von Christian R. (supachris)


Lesenswert?

Die -msp430 Option ist für diese Uniarch Geschichte, das hab ich aber 
auch noch nicht vollständig durchschaut. Ich hab bei Compiler und Linker 
Optionen jeweils die vollständige Bezeichnung des MSP beim -mmcu 
Parameter drin, damit klappts. Bei einem neuen Projekt im CCE6 wird das 
nicht korrekt gesetzt.

von A. B. (brewnera)


Lesenswert?

Wenn ich unter CCS Build > GNU Compiler > Runtime > bei -mmcu 
"msp430g2231" eintrage, bleiben immer noch diese vier Fehler vorhanden. 
Muss man das noch sonst wo eintragen?

von Christian R. (supachris)


Lesenswert?

Ich hab bei Runtime:
Target CPU: leer
Target MCU: MSP430f5172
Rest alles leer

Bei CCS General
Variant: MSP430F5172
Linker Command file: msp430f5172.ld
Runtime support lib: libc.a

Das mit dem extra Linker mmcu war mein Fehler, das war beim MSPGCC 
PlugIn immer so. Der TI setzt das automatisch rein.

von A. B. (brewnera)


Lesenswert?

Hatte das schon mehrmals ohne Erfolg versucht, aber jetzt funktioniert 
es auf einmal. Hab mehrere Beispielprojekte ausprobiert. Beim GNU v4.8.0 
verwende ich jetzt folgende Einstellungen:

CCS Build > GNU Compiler > Runtime:
alles leer bis auf Target MCU: MSP430G2231

CCS General:
Variant: MSP430G2231
Linker Command file: msp430g2231.ld
Runtime support lib: libc.a

Damit funktioniert's! Vielen Dank für die Hilfe!

EDIT:
Hab gerade die Ursache für den RAM-overflow Fehler gefunden. Da verlässt 
man sich auf mitgelieferte Beispielprogramme und übersieht, dass am Ende 
des Hauptprogramms die while(1)-Schleife fehlt. Das gefällt dem 
gcc-compiler offensichtlich nicht. Bisher war am Ende immer nur
1
__bis_SR_register(LPM0_bits + GIE);
also Low-power-Mode 0 und Interrupts aktivieren. Ein einfaches while(1); 
danach und schon ist der gcc glücklich!

: Bearbeitet durch User
von Ecki (Gast)


Lesenswert?

A. Brewner schrieb:
> Wo genau soll ich die '*(COMMON)' Zeile hin verschieben?

Hab's nicht selber ausprobiert, denke aber mal, dass die nach dieser 
Zeile kommen soll:
1
    *(.bss .bss.* .gnu.linkonce.b.*)

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.