Forum: Mikrocontroller und Digitale Elektronik C505C(8051 und derivate)


von micro1 (Gast)


Lesenswert?

Kennst sich einer mit dem C505C aus?
Ich habe folgendes Problem. Ich habe einen C505C mit externen Speicher
und SRAM. Ich Übersetze meine Programme mit dem C51 Compiler von Keil.

Wenn ich im Compiler sage nutze den internen SRAM läuft das Programm
mit normaler geschwindigkeit. Wenn ich nun aber im Compiler sage ich
habe large memory(#pragma large) läuft mein Programm total langsamm ab
aber es läuft woran liegt das?

von Dietmar (Gast)


Lesenswert?

Beim Standard-8051 war das so: Befehle, die auf Speicherbereiche einer
2k-Page zugreifen (AJMP und ACALL), haben 2 Byte Größe und 1 Zyklus
Ausführungszeit. Bei Zugriffen über eine 2k-Page hinaus braucht man
LJMP und LCALL, die 3 Byte Größe haben und mit 2 Zyklen die doppelte
Ausführungszeit. Der C-Compiler generiert also je nach Speichergröße
und Speicherarchitektur (Speicher intern oder extern?) verschiedenen
Code.

Bei internen Daten verwendet er gerne Register, die 1 Zyklus
Ausführungszeit haben. Muß er die Daten von externem Speicher holen,
lädt er die erst in interne Register um, was 2 Zyklen Ausführungszeit
zusätzlich braucht (MOVX- und MOVC-Befehle). Und speichert die Daten
nach Bearbeitung auch nochmal zurück, was bei externem Speicher wieder
Zeit kostet.

Mit externem Speicher ist auch auf dem Chip integriertes FLASH oder
XRAM gemeint, da es wie bei zu früheren Zeiten echtem extern
befindlichem Speicher angesprochen wird.

Schau doch mal ins Listing (*.lst), das bringt sicher Erleuchtung.

Gruß

Dietmar

von micro1 (Gast)


Lesenswert?

Ja aber wenn das 2 Zyklen sind wäre ja schön.
Z.b wenn ich das speichermodell small benutzte dauert die Abfrage eines
Taster ms. Bei large dauert es wirklich 1 Sekunde bis der Prozessor
merkt das ich ein Taster gedrückt habe.

von peter dannegger (Gast)


Angehängte Dateien:

Lesenswert?

Den Unsinn sieht man leider immer wieder, die Leute nehmen das
Large-Modell und zwingen damit den Compiler sämtliche Variablen im
XDATA anzulegen.

Natürlich muß das grottenlangsam sein, gar keine Frage !

Warum die das machen, ist mir absolut rätselhaft.
Eins weiß ich aber genau, die haben weder das Keil-Handbuch, noch den
C51-Primer gelesen.

Es hat schon seinen Sinn, daß per default das Modell Small ausgewählt
ist.

Hat man große Datenfelder oder Variablen, die selten benötigt werden,
kann man sie genauso gut im Small Modell als xdata deklarieren, um sie
auszulagern.


Es mag Fälle geben, wo Large Sinn macht, aber die sind mir bisher noch
nicht untergekommen.

Anbei mal das Listing, wie ein i++; in Small und wie es in Large
aussieht, der CPU-Zeitverbrauch ist 1:7.


Peter

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.