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

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.