www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CCS Compiler Code langsamer als PICC-Pro (Hi-Tech)


Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

ich habe zwei identische Programme für die Compiler "CCS" und 
"PICC-PRO".

Jetzt habe ich mir die serielle Datenübertragung (SPI / 
Software-Emuliert) bei beiden Versionen am Osci angesehen und musste 
feststellen, dass die Übertragung bei PICC-PRO >>>280KHz<<< beträgt und 
beim CCS nur >>>50KHz<<<.

Woran kann das liegen? Der Code ist nahezu identisch.

Gruß,
 Tobias

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias John wrote:

> Woran kann das liegen? Der Code ist nahezu identisch.

Wenn der Quellcode identisch ist, dann muss das der erzeugte Code 
keineswegs sein. Erst recht nicht bei einer Architektur, die sich als 
Ziel von C Compilern nicht wirklich anbietet.

Ausserdem können Compiler-Einstellungen einen Unterschied machen. Ein 
Beispiel dazu: Der C Standard schreibt vor, dass "int" und "unsigned" 
mindestens 16 Bits haben. Bei PICs ist das vorsichtig ausgedrückt etwas 
suboptimal. Und so haben manche Compiler die Möglichkeit, mit 8-Bit 
"int" zu arbeiten. Und dies vielleicht sogar als Voreinstellung.

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die CPU Frequenz wissen beide Compiler?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst ja mal den erzeugten Code posten, den von der Software-SPI 
Schleife.

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hier der Code vom PICC-Pro Compiler der mit 280KHz läuft:
void display_write(unsigned char word, unsigned char _A0) {
  unsigned char zhl;
  A0 = _A0;
  for(zhl=8; zhl>0; zhl--) {
    SCK = 0;
    SDI = 0;
    if( word & 0x80 )
          SDI = 1;
    word <<= 1;
    SCK = 1;
  }
  SCK = 0;
  SDI = 0;
}
Die Funktion schreibt Daten/Befehl an ein DOG-M-Display

und hier der Code vom CCS-Compiler - der läuft viel zu langsam mit ca 
50KHz.
void display_write(unsigned char word, int1 _A0) {
  unsigned char zhl;
  output_bit(A0,_A0);
  for(zhl=8; zhl>0; zhl--) {
    output_low(SCK);
    output_low(SDI);
    if( word & 0x80 )
          output_high(SDI);
    word <<= 1;
    output_high(SCK);
  }
  output_low(SCK);
  output_low(SDI);
}

Da ist ja im Grunde kein Unterschied... und doch läuft der 
CCS-Compiler-Code viel langsamer...

Gruß,
 Tobias

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fuses sind auch richtig gesetzt, also gleiche Taktfrequenz?
Die 50kHz sind in der Schleife gemessen, dann muss ja in dieser das 
Problem sein und somit bleiben als Fehlerkandidaten nur noch übrig:

>   for(zhl=8; zhl>0; zhl--) {
>     if( word & 0x80 )
>           output_high(SDI);
>     word <<= 1;
>   }

Autor: Colt Fish (Firma: TUC) (coltfish)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwendest Du beim CCS Compiler im Code die #use fast_io(A) - Direktive 
für die verwendeten Ports? Wenn nicht, dann ist der Fall klar:
Der Compiler fügt vor jedem "output_high" bzw. "output_low" ein 
"set_tris..." ein, um den Pin als Ausgang zu beschalten. Das kostet 
natürlich Zeit.

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taktfrequenzmeter ist die gleiche. Fuses sind gleich bei beiden 
Programmen...

Irgendwie muss es am Compiler liegen... ich glaube eher das es an der 
Funktion "output_low()" liegt - aber wieso/woran genau... ?!?!

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Colt Fish schrieb:
> Verwendest Du beim CCS Compiler im Code die #use fast_io(A) - Direktive
> für die verwendeten Ports? Wenn nicht, dann ist der Fall klar:
> Der Compiler fügt vor jedem "output_high" bzw. "output_low" ein
> "set_tris..." ein, um den Pin als Ausgang zu beschalten. Das kostet
> natürlich Zeit.

Ahhh!!! das erklärt das Problem wahrscheinlich. Ich werde es gleich mal 
ausprobieren.

Danke für den Tipp - der CCS und seine Eigenheiten sind mir noch nicht 
so geläufig.

Gruß,
 Tobias

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Virtuelle Fabrik?

Carsten

Autor: Colt Fish (Firma: TUC) (coltfish)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carsten schrieb:
> Virtuelle Fabrik?

öhm, wie jetzt?

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.