Forum: Mikrocontroller und Digitale Elektronik TriCore Entwicklungsumgebung HighTec vs. Tasking


von trabbie (Gast)


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 :-)

von Klaus B. (Gast)


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ß.

von Johann L. (gjlayde) Benutzerseite


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".

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.