Hallo, kennt sich jemand mit dem Schreiben von Interrupt-Routinen beim C51 von Keil aus? Habe folgendes Programm: Die serielle Schnittstelle soll interruptgesteuert arbeiten, mit einem Ringbuffer. Die Ringbuffer-Routinen funktionieren, und die Routinen für das Schreiben/Lesen in den seriellen Buffer sind ebenfalls geschrieben, aber noch nicht getestet. In den Schreib/Lese-Routinen lösche ich das ES-Bit, um zu verhindern, dass ein serieller Interrupt den Buffer durcheinander bringt, während ich darauf zugreife. Meine Frage ist nun, was ich für den seriellen Interrupt schreiben muss. 1. Da ich die Schreib/Lese-Routinen für den Ringbuffer sowohl im Interrupt als auch in den Routinen für die serielle Schnittstelle verwende, müssen die Ringbuffer-Routinen "reentrant" sein, richtig? 2. Kann ich den Interrupt in einer anderen Registerbank laufen lassen? Oder verhaspele ich mich da dann mit den Ringbuffer-Routinen, da die in der eigentlichen Applikation ja in RB0 laufen? 3. Was muss ich sonst noch beachten? Gruß Stefan
Die Syntax für Interrupt-Handler ist beim Keil: void funktions_name ( void ) interrupt interrupt_nummer { } Man sollte aber tunlichts vermeiden irgendwelche Funktionsungetüme aus der PC-Welt zu übernehmen, ein 8051 läuft nunmal nicht mit 4GHz und 2GB RAM. Daher würde ich im Empfangsinterrupt nur das Schreiben in den Empfangspuffer und im Sendeinterrupt das Lesen aus dem Sendepuffer direkt einfügen (keine Unterprogramme). Dann brauchst du auch nichts reentrantes. Eine andere Registerbank im Interrupt lohnt selten. Und vor allem das Small-Modell benutzen, die Puffer können bei Bedarf als pdata oder xdata deklariert werden. Das Large-Modell benötigt im Schnitt doppelt soviel Codespeicher und läuft höchstens halb so schnell. Das Large-Modell ist nur für die Leute, die nicht wissen wollen, daß der 8051 superschnellen data-Speicher und schnarchlahmen xdata-Speicher hat. Peter
Hi Peter, danke für Antwort. Ich bin auch auf den Trichter gekommen, den Ringspeicher direkt in der ISR zu behandeln. Werd ich so machen. Hoffentlich bleibt genug Zeit übrig, um auch ein bisschen Handshake zu machen ;-) Gruß Stefan
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.