C505C(8051 und derivate)

Gast #325454
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?
Gast #325455
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
Gast #325456
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.
Gast #325457
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren