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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.