Forum: Compiler & IDEs dsPIC und C30


von Thorsten (Gast)


Lesenswert?

Hallo,

ich habe zwei Fragen zum Microchip C30 Compiler für dsPICs. Ich hoffe,
dieser Beitrag ist hier nicht off-topic, schließlich ist der C30 ja
auch eine GCC Portierung.

Folgendes Problem:

#include "p30f6014.h"

#define BitIsSet(Register, BitNo) ((Register & (1<<BitNo))>>BitNo)
...
if(BitIsSet(U1STA, UTXBF))...

Dieser Code verursacht einen Fehler: "`UTXBF' undeclared (first use
in this function)". Ein Blick in die p30f6014.h offenbart dann auch,
daß offensichtlich keine Bit Definitionen wie "#define UTXBF 9"
enthalten sind. Was in der Datei steht, ist folgendes:

extern volatile unsigned int U1STA __attribute__((_near_));
extern volatile UxSTABITS U1STAbits __attribute__((_near_));

typedef struct tagUxSTABITS {
        unsigned URXDA  :1;
        unsigned OERR   :1;
        unsigned FERR   :1;
        unsigned PERR   :1;
        unsigned RIDLE  :1;
        unsigned ADDEN  :1;
        unsigned URXISEL:2;
        unsigned TRMT   :1;
        unsigned UTXBF  :1;
        unsigned UTXEN  :1;
        unsigned UTXBRK :1;
        unsigned        :3;
        unsigned UTXISEL:1;
} UxSTABITS;

Damit kann ich nichts anfangen. Ich kann nicht so recht glauben, daß
die gew. Bit Definitionen nicht vorhanden sein sollen. Muß ich das
wirklich selbst erledigen?

Meine zweite Frage bezieht sich auf spezielle Befehle, die der dsPIC
bereitstellt. Ist es richtig, daß der C30 Befehle wie "repeat" und
"do" grundsätzlich nicht unterstützt? Oder gibt es doch einen Weg,
den Compiler dazu zu überreden?

Vielleicht hat ja jemand schon mit dem C30 gearbeitet und kann mir
helfen. Ich benutze übrigens die Version 1.20.

Vielen Dank.

Gruß
Thorsten

von Rufus T. Firefly (Gast)


Lesenswert?

Was Du da entdeckt hast, ist ein Bitfeld. Damit kann man recht elegant
auf einzelne Bits eines Registers zugreifen und muss nicht mit Makros
wie "bit_is_set" herumhantieren.

Statt

  if(BitIsSet(U1STA, UTXBF))...

musst Du nur schreiben

  if (U1STA.UTXBF) ...

vorausgesetzt, daß U1STA vom Typ UxSTABITS ist.

Das Setzen eines solchen Bits geht entsprechend

  U1STA.UTXBF = 1;

(geflissentlich die Tatsache ignorierend, daß ein UART-Statusregister
nicht beschrieben werden mag, aber das Prinzip des Umgangs mit
Bitfeldern dürfte es verdeutlichen)

Die zweite Frage verstehe ich nicht so recht; "do" ist ein
C-Schlüsselwort, "repeat" hingegen nicht.

von Thorsten (Gast)


Lesenswert?

Danke Rufus, du hast mir sehr geholfen. Mit if(U1STAbits.UTXBF)...
funktioniert es prima. Solche Bitfelder sind mir bisher noch nicht
untergekommen :)

Zu dem zweiten Problem: der dsPIC unterstützt hardwaremäßig Schleifen.
"do" und "repeat" sind zwei Assemblerbefehle, mit denen die
Schleifen eingeleitet werden. Z. B. folgendes Programm:

int i;

for(i=0;i<512;i++) PORTB++;

reduziert sich in Assembler zu:

repeat #511    ; 1 cycle, wird nur einmal ausgeführt
inc    PORTB   ; 1 cycle

Es werden also nur 1+512=513 Take benötigt, ohne diesen repeat-Befehl
wären es deutlich mehr.

Na jedenfalls scheint der C30 diese speziellen Befehle nicht zu
unterstützen. Wäre nicht verwunderlich, hab hier schon oft gelesen daß
C-Compiler spezielle Befehle nicht benutzen.

Gruß
Thorsten

von Joachim (Gast)


Lesenswert?

"Na jedenfalls scheint der C30 diese speziellen Befehle nicht zu
unterstützen. Wäre nicht verwunderlich, hab hier schon oft gelesen daß
C-Compiler spezielle Befehle nicht benutzen."

Das ist so nicht richtig. Es hängt vom Compiler ab, ob er das
unterstützt. Es ist aber gut möglich, dass der GCC das nicht
unterstützt, dieser Controller ist nicht weit verbreitet, so dass da
nicht so viel Aufwand bei der Portierung, insbesondere bei der
Optimierung betrieben wird.

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.