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


von Tobias J. (tobiasjohn) Benutzerseite


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

von (prx) A. K. (prx)


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.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Die CPU Frequenz wissen beide Compiler?

von (prx) A. K. (prx)


Lesenswert?

Kannst ja mal den erzeugten Code posten, den von der Software-SPI 
Schleife.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Hallo,

hier der Code vom PICC-Pro Compiler der mit 280KHz läuft:
1
void display_write(unsigned char word, unsigned char _A0) {
2
  unsigned char zhl;
3
  A0 = _A0;
4
  for(zhl=8; zhl>0; zhl--) {
5
    SCK = 0;
6
    SDI = 0;
7
    if( word & 0x80 )
8
          SDI = 1;
9
    word <<= 1;
10
    SCK = 1;
11
  }
12
  SCK = 0;
13
  SDI = 0;
14
}
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.
1
void display_write(unsigned char word, int1 _A0) {
2
  unsigned char zhl;
3
  output_bit(A0,_A0);
4
  for(zhl=8; zhl>0; zhl--) {
5
    output_low(SCK);
6
    output_low(SDI);
7
    if( word & 0x80 )
8
          output_high(SDI);
9
    word <<= 1;
10
    output_high(SCK);
11
  }
12
  output_low(SCK);
13
  output_low(SDI);
14
}

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

Gruß,
 Tobias

von Alexander S. (esko) Benutzerseite


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;
>   }

von Colt F. (Firma: TUC) (coltfish)


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.

von Tobias J. (tobiasjohn) Benutzerseite


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... ?!?!

von Tobias J. (tobiasjohn) Benutzerseite


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

von Carsten (Gast)


Lesenswert?

Virtuelle Fabrik?

Carsten

von Colt F. (Firma: TUC) (coltfish)


Lesenswert?

Carsten schrieb:
> Virtuelle Fabrik?

öhm, wie jetzt?

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.