www.mikrocontroller.net

Forum: Compiler & IDEs dsPIC und C30


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.