Forum: Mikrocontroller und Digitale Elektronik 64Bit Variablen auf dem MSP430


von Teetrinker (Gast)


Lesenswert?

Hallo liebes Froum,

ich meine hier gelesen zu haben, dass es mit dem MSPGCC nicht möglich 
ist uint64_t zu verwenden.

Meine Frage ist nun, ob sich da inzwischen was neues ergeben hat?
Falls es eine neuere Version geben sollte, die mit 64Bit-Variablen 
klarkommt ... gibt es einen Weg diese aktuellere Compilerversion in das 
Code Composer Studio zu integrieren?

Gruß
Teetrinker

von Oliver J. (skriptkiddy)


Lesenswert?

Hat denn der Compiler kein Manual [1], aus dem man solche Informationen 
herausziehen könnte?


Gruß Skriptkiddy


[1] http://mspgcc.sourceforge.net/manual/
    (würde da mal bei "data types" nachschauen)

von Christian R. (supachris)


Lesenswert?

Der CCE kann keine 64 Bit Variablen, der GCC schon und IAR meines 
Wissens auch.

von Peter D. (peda)


Lesenswert?

Teetrinker schrieb:
> ich meine hier gelesen zu haben, dass es mit dem MSPGCC nicht möglich
> ist uint64_t zu verwenden.

Sogar der AVR-GCC (8Bit-CPU)) kann es, also sollte der MSP (16Bit-CPU) 
es doch erst recht können.

Allerdings ist es auf dem AVR extrem aufwendig programmiert und damit 
sogar größer und langsamer als float.


Peter

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:

> Sogar der AVR-GCC (8Bit-CPU)) kann es, also sollte der MSP (16Bit-CPU)
> es doch erst recht können.

Der maschinenspezifische Teil von GCC definiert die Grösse der 
Datentypen und dessen Entwickler trifft die Entscheidung, ob er sich die 
Mühe mit 64-bit Typen macht oder nicht. Denn von allein gibts die nicht, 
die Codeerzeugung für die betreffenden Operationen muss dort manuell 
eingebaut werden.

> Allerdings ist es auf dem AVR extrem aufwendig programmiert und damit
> sogar größer und langsamer als float.

Der inline erzeugte Code ist deshalb ineffizent, weil der Entwickler 
sich bei diesen Operationen weit weniger Mühe gegeben hat als bei den 
viel wichtigeren 8/16-Bit Operationen. D.h. der Compiler beschränkt sich 
hauptsächlich auf generische Operationen für beliebige Operanden, 
berücksichtigt besondere Fälle wie Shifts mit Konstanten eher wenig.

von Peter D. (peda)


Lesenswert?

A. K. schrieb:
> Der inline erzeugte Code ist deshalb ineffizent, weil der Entwickler
> sich bei diesen Operationen weit weniger Mühe gegeben hat als bei den
> viel wichtigeren 8/16-Bit Operationen.

Soweit ich das verstanden habe, ist das noch komplizierter:

Der AVR-GCC kennt nur max 4 Register je Operand und daher kann man 64Bit 
(= 8 Register) nicht in Assembler implementieren.
Daher wurde 64Bit komplett in C geschrieben mit indirekter Adressierung 
(8 Byte-Array) und das kostet extrem.

Ansonsten wäre 64Bit ein Klacks, selbst wenn man es nicht optimiert.
Einfach 8 * hinschreiben "ADC Rn, Rm" kann man nicht weiter optimieren.


Peter

von Christian R. (supachris)


Lesenswert?

Peter Dannegger schrieb:
> Sogar der AVR-GCC (8Bit-CPU)) kann es, also sollte der MSP (16Bit-CPU)
> es doch erst recht können.

Klar kann der mspgcc das schon immer. Lediglich der TI Compiler im CCE 
kann keine 64 Bit Variablen.

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:

> Soweit ich das verstanden habe, ist das noch komplizierter:

Yep, stimmt. Bei ARM&Co sind die Operatoren für DI Typen im MD-File, bei 
AVR nicht. Offenbar greift da ein generischer Codegenerator. Sieht 
zugegebenermassen grässlich aus.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. K. schrieb:
> Peter Dannegger schrieb:
>
>> Sogar der AVR-GCC (8Bit-CPU)) kann es, also sollte der MSP (16Bit-CPU)
>> es doch erst recht können.
>
> Der maschinenspezifische Teil von GCC definiert die Grösse der
> Datentypen und dessen Entwickler trifft die Entscheidung, ob er sich die
> Mühe mit 64-bit Typen macht oder nicht. Denn von allein gibts die nicht,
> die Codeerzeugung für die betreffenden Operationen muss dort manuell
> eingebaut werden.

Nein, alles was man machen muss, ist word_mode (8 Bit für avr) und 
kleinere zu unterstützen. Alles, was darüber hinausgeht, ist bereis 
"offen" in GCC codiert. Will man besseren Code, muss man das Backend 
aufpolieren -- in avr-gcc ist das gemacht für float, short und long. 
Aber das ist reiner Luxus; notwendig für einen funktionierenden Compiler 
ist es nicht.

>> Allerdings ist es auf dem AVR extrem aufwendig programmiert und damit
>> sogar größer und langsamer als float.
>
> Der inline erzeugte Code ist deshalb ineffizent, weil der Entwickler
> sich bei diesen Operationen weit weniger Mühe gegeben hat als bei den
> viel wichtigeren 8/16-Bit Operationen. D.h. der Compiler beschränkt sich
> hauptsächlich auf generische Operationen für beliebige Operanden,
> berücksichtigt besondere Fälle wie Shifts mit Konstanten eher wenig.

Aufwändig wird es, weil im AVR-Teil nichts gemacht ist. Eine Addition 
wird also in 8-Bit Stückchen zerbröselt mit soft-codiertem Carry. Nicht 
die Einzel-Additionen sind aufwändig, sondern das Carry-Geraffel.

Peter Dannegger schrieb:
> A. K. schrieb:
>> Der inline erzeugte Code ist deshalb ineffizent, weil der Entwickler
>> sich bei diesen Operationen weit weniger Mühe gegeben hat als bei den
>> viel wichtigeren 8/16-Bit Operationen.
>
> [...]
>
> Ansonsten wäre 64Bit ein Klacks, selbst wenn man es nicht optimiert.
> Einfach 8 * hinschreiben "ADC Rn, Rm" kann man nicht weiter optimieren.

Das Problem ist nicht die Arithmetik. Das Problem ist a=b, also einen 
64-Bit-Wert von a nach b zu bringen. Das ginge sogar in avr-gcc ohne die 
binutils zu erweitern.

Allerdings ist das so aufwändig, daß es bisher niemand gemacht hat, und 
die AVR-Maintainer eine Unterstützung nicht machen möchten bzw. nicht 
für sinnvoll halten. Seh ich übrigens auch so. Ich kann mir auch nicht 
annähernd vorstellen, daß sich jemand freiwillig diesen Wolf macht. Oder 
ihr geht hier mit dem Klingelbeitel rum, um Geld für die 1-2 Mannmonate 
zu sammeln, die ein erfahrener GCC-Entwickler mit entsprechender 
Expertise so kostet... ;-)

von Teetrinker (Gast)


Lesenswert?

Hallo,

vielen Dank für die vielen und interressanten Beiträge!

Es gibt also bisher drei Möglichkeiten, wenn man als CCE-User mit 64Bit 
Variablen arbeiten möchte:
1)Umsteigen auf IAR
2)Umsteigen auf Eclipse + MSPGCC
3)Man(n) frickelt sich das selber hin ...

Im Fall des Kollegen, wegen dem ich hier frage, geht es um eine oder 
zwei Multiplikationen, deren Ergebnis dann 64Bit groß wird ... 
vielleicht ist Lösung 3 die praktikabelste für uns?


Liebe Grüße
Teetrinker

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Teetrinker schrieb:

> 2)Umsteigen auf Eclipse + MSPGCC

Wenn -- wie du oben schreibst -- der msp-gcc keine 64-Bit Variablen 
unterstützt, dann bringt's auch nix, das Ding unter Eclipse 
anzusprechen.

Auch ist nicht klar, was mit "MSPGCC kommt nicht klar mit..." gemeint 
ist.
* Macht er falschen Code?
* Gibt es einen Fehler?
* Ist der falsche Standard gewählt? uint64_t ist C99.
* Fehlt einfach nur ein
1
#include <stdint.h>
?

von Christian R. (supachris)


Lesenswert?

Johann L. schrieb:
> Wenn -- wie du oben schreibst -- der msp-gcc keine 64-Bit Variablen
> unterstützt, dann bringt's auch nix, das Ding unter Eclipse
> anzusprechen.

Wir hatten ja schon ausfürlich dargelegt, dass der mspgcc 
selbstverständlich uint64_t kann. ich hab da auch schon eine Menge mit 
programmiert, das klappt.

Allerdings ist der Umstieg besonders für nicht so hart gesottene eine 
Qual, denn der GDB Debugger ist kaum brauchbar, und kann im Vergleich zu 
allen anderen MP430 Debuggern so gut wie gar nichts. Da hilft auch 
Eclipse wenig. Nicht mal so primitive Sachen wie "Step Over" oder 
"Restart" sind implementiert. Da kann man vielleicht eher bei CEE 
bleiben, und versuchen, so große Multiplikationen zu vermeiden. Oder 
halt richtig Kohle für Crossworks oder IAR ausgeben....

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oder fehlerfreie Programme schreiben. wegduck

> Michelangelo reportedly said that he could see a statue in a
> block of marble, and that his goal as a sculptor was to carve
> away everything which wasn't part of the statue.
> Some programmers appear to similarly believe that programming
> means starting with a block of code, and carving away everything
> which isn't part of the program. This is also known as
> programming by debugging. It's a bad idea. Don't do it.

von Teetrinker (Gast)


Lesenswert?

Moin,

>Johann L. schrieb:
> Auch ist nicht klar, was mit "MSPGCC kommt nicht klar mit..." gemeint
> ist.
Stimmt :)
In der stdint.h die bei CCE mitkommt steht, dass es keine 64Bit 
Unterstützung gibt .... 32Bit funktioniert ...
> * Macht er falschen Code?
> * Gibt es einen Fehler?
Trotz #include <stdint.h> kommt der Compilerfehler:
uint64_t unknown usw. bei longlong ebenso.
> * Ist der falsche Standard gewählt? uint64_t ist C99.
Kann sein, ein guter Ansatzpunkt zum suchen, hab noch keine Ahnung, wo 
man das einstellen kann ...

>> Michelangelo reportedly said that he could see a statue in a
>> block of marble, and that his goal as a sculptor was to carve
>> away everything which wasn't part of the statue.
>> Some programmers appear to similarly believe that programming
>> means starting with a block of code, and carving away everything
>> which isn't part of the program. This is also known as
>> programming by debugging. It's a bad idea. Don't do it.

Dear Mr.Michelangelo,
Have you any pieces of marbre, handling 64Bit datatypes like uint64_t or 
longlong in the language C for the MSP430GCC-Compiler included in the 
software from Texas Instruments?

Yours
Strg+V. Guttenberg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Oder halt richtig Kohle für Crossworks oder IAR ausgeben....

Naja, Crossworks ist für private Nutzung schon ein paar Größenordnungen 
günstiger als IAR, knapp 110 EUR ist was anderes als ein paar tausend:
http://sites.fastspring.com/rowley/product/crossworksformsp430

(Davon abgesehen bietet Crossworks die reizvolle Möglichkeit, auch unter 
anderen Betriebssystemen als Windows nutzbar zu sein)

von Christian R. (supachris)


Lesenswert?

Teetrinker schrieb:
> the MSP430GCC-Compiler included in the
> software from Texas Instruments?

Du hast offenbar was grundlegendes nicht verstanden. Der mspgcc ist 
nicht der Compiler, der in CCE integriert ist. Der CCE Compiler ist 
ein eigener von TI, der hat mit dem GCC rein gar nichts zu tun.
Auch kann man den nicht in den CCE direkt integrieren. Also in das 
Eclipse da schon, aber dann hast du auch nicht mehr davon, als wenn du 
den in ein Standard-Eclipse integrierst. Den TI-Debugger und die 
Projekt-Wizzards kannst du nicht für den mspgcc nutzen.

von Teetrinker (Gast)


Lesenswert?

Hallo,

danke für die vielen und guten Infos !!!
Mal schauen wie es jetzt weitergeht ...

Gruß
Teetrinker

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.