TriCore Entwicklungsumgebung HighTec vs. Tasking

Gast #2065418
Lesenswert?

Hallo,

derzeitig bin ich dabei, eine PWM auf einem TriCore TC1166 (Infineon) zu 
realisieren. Da wir evaluieren möchten, ob uns die Altium Tasking 
Umgebung oder eben die HighTec Umgebung mehr taugt, versuche ich, mich 
gerade in Testversionen beider Systeme einzuarbeiten.

Die PWM selbst habe ich mit DAvE erzeugt, das funktioniert in beiden 
Systemen ganz gut, mit leichen Performance-Vorteilen der Executable vom 
HighTec-Compiler.
Dazu eine erste Frage: Da ich noch einige Zusatzfunktionen einbauen 
möchte, brauche ich eine Funktion, die aus zwei (unsigned) int den 
grösseren oder kleineren Wert zurückgibt. In Tasking gibt es dafür z.B. 
den Compilereigenen
1
int c = __minu(a,b)
Aber nirgendwo kann ich finden, wie ich so was mit dem GNU-Compiler des 
HighTec-Systems lösen kann?!?

Hättet ihr da eine Idee?

Besten Dank und
herzliche Grüsse :-)
Gast #2068293
Lesenswert?

Hi,

ja gibt es natürlich. Dabei handelt es sich um spezielle Befehle des 
TriCore-Befehlssatzes (zB. diese hier habe ich selber öfters verwendet: 
_dsync(), _isync(), _nop(), _debug()).

Wie jetzt speziell der für min.u lautet, weiß ich aus dem Kopf jetzt 
nicht.
Aber der GNU-GCC stellt mit dem Inline-Assembler eine universelle 
Schnittstelle zu Verfügung, mit der man schlußendlich all diese 
"Spezialbefehle" auch selbst zusammenbauen kann:

Nur zur Veranschaulichung (da ich die Argumente von min.u nicht 
auswendig im Kopf haben):
uint32 x_u32;
uint32 y_u32;

asm (" min.u %0, %1"
    :"=d" (x_u32), "d" (y_u32)
    );

Übrgens würde ich dir die Hightec-Toolchain nahe legen. Ich habe sowohl 
mit Tasking als auch mit Hightec gearbeitet. Der Tasking-Compiler hat 
mir aber die letzten Nerven geraubt (vorallem mit der total 
undurchsichtigen Linker-Commandfile-Sprache) und deren Unflexibilität.
Der GNU-GCC ist da sehr leicht und transparent konfigurierbar. Vor allem 
die Linkerskripts sind einfach zu schreiben.

Gruß.
Persönliche Seite #2075057
Lesenswert?

trabbie schrieb:

> Dazu eine erste Frage: Da ich noch einige Zusatzfunktionen einbauen
> möchte, brauche ich eine Funktion, die aus zwei (unsigned) int den
> grösseren oder kleineren Wert zurückgibt. In Tasking gibt es dafür z.B.
> den Compilereigenen
1
int c = __minu(a,b)
> Aber nirgendwo kann ich finden, wie ich so was mit dem GNU-Compiler des
> HighTec-Systems lösen kann?!?
>
> Hättet ihr da eine Idee?

Das kann doch in normalem C ausgedrückt werden:
1
unsigned a, b, c;
2
// ...
3
c = a < b ? a : b;

Das ist portabel und man verheddert sich nicht in Inline-Assembler.

Falls man wirklich den Code mit Assembler spicken und möglichst 
kryptisch gestalten will: Die Constraints für D-Register ist "d" und für 
eine unsigned 9-Bit-Konstante AFAIR "I" oder "J" (im Handbuch 
nachlesen!)
1
asm ("min.u %0, %1, %2" : "=d" (c) : "d" (a), "dI" (b));

Je nach Compiler-Version hat tricore-gcc auch Builtin-Funktionen wie 
__builtin_minu oder so. Auch hier hilft ein Blick ins Handbuch, irgendwo 
bei "Builtin Functions" oder "Intrinsic Functions".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren