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
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.
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
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.