Hi, arbeite mich gerade in C- Programmierung ein: a) Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer leeren Funktion definieren ( wie ich das in Assembler machen muss -> rjmp) b) Wird das SREG automatisch gesichert - oder muss ich das selber machen ? Gruß und Danke ! S.
Simon wrote: > Hi, > > arbeite mich gerade in C- Programmierung ein: > > a) Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer > leeren Funktion definieren ( wie ich das in Assembler machen muss -> > rjmp) Nein > b) Wird das SREG automatisch gesichert Ja > - oder muss ich das selber > machen ? Nein
Simon wrote: > a) Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer > leeren Funktion definieren ( wie ich das in Assembler machen muss -> > rjmp) In Assembler mußt Du nen Quark tun. Auch wenn einige Leute nicht benutzte Interrupts mit einem RETI belegen, damit sie sich dann bei der Fehlersuche nen Wolf suchen können. In C wird ein default Handler angesprungen, den man tunlichst mit was sinnvollem belegen sollte, sonst macht er einfach nen Neustart und man sucht sich auch nen Wolf warum. Für benutzte Interrupts wird automatisch der Handler angesprungen, wenn man ihn definiert hat. > b) Wird das SREG automatisch gesichert - oder muss ich das selber > machen ? Du machst C und damit sind die Register und SREG erstmal für Dich tabu. Der Compiler weiß selber, wann er was zu sichern hat. Peter
@ Karl heinz Buchegger, >> b) Wird das SREG automatisch gesichert >Ja Detailierter: In C ja, in Assembler musst du dich selbst darum kümmern.
Peter Dannegger wrote: > In C wird ein default Handler angesprungen, den man tunlichst mit was > sinnvollem belegen sollte, sonst macht er einfach nen Neustart und man > sucht sich auch nen Wolf warum. > > Für benutzte Interrupts wird automatisch der Handler angesprungen, wenn > man ihn definiert hat. Zwar diesmal ein anderer Simon, aber der hat auch eine Frage: Wie soll denn der default-Handler heißen? Im Listfile sehe ich, dass __bad_interrupt angesprungen wurde. Das ist eine Funktion, die im crt definiert ist.. EDIT: *hust *röchel http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html Besser vorher in die Doku schauen *kratz. Ist der Default-Vektor eigentlich was neues? Hab den bisher noch nie irgendwo gesehen.
Simon Küppers wrote: > Besser vorher in die Doku schauen *kratz. Ist der Default-Vektor > eigentlich was neues? Hab den bisher noch nie irgendwo gesehen. Nö, den gibt's schon viele Jahre lang. Ist aber nicht wirklich so nützlich, wie Peter dich glauben machen will, außer dass man bei schlampiger Programmierung einen Brechpunkt im Debugger draufsetzen kann. Aber das wesentliche Feature, was ihm fehlt, ist dass es keine "COME FROM"-Anweisung gibt... naja, nicht ganz, aber du merkst sicher, worauf das hinaus läuft: wenn er triggert, weißt du zwar, dass du einen nicht zugewiesenen Interrupt hattest, aber das hättest du natürlich genauso gemerkt, wenn du den Breakpoint auf die Adresse 0 gesetzt hättest und diese ohne einen Reset erreicht worden ist. Nur, wer ihn getriggert hat, bekommst du nicht so ohne weiteres raus, und das ist es, was dich eigentlich interessiert. Wenn ich wirklich in das Dilemma laufe, dann generiere ich mir üblicherweise mit einem Einzeiler-Perlscript (gleich auf der Kommandozeile) sowas wie:
1 | uint8_t irq_number; |
2 | |
3 | ISR(__vector_1) |
4 | {
|
5 | irq_number = 1; |
6 | exit(); |
7 | }
|
8 | |
9 | ISR(__vector_2) |
10 | {
|
11 | irq_number = 2; |
12 | exit(); |
13 | }
|
14 | |
15 | ISR(__vector_3) |
16 | {
|
17 | irq_number = 3; |
18 | exit(); |
19 | }
|
20 | /* ... */
|
Die wirklich benutzten Vektoren werden dann ausgespart, und man setzt im Debugger den Breakpoint auf exit().
Jörg Wunsch wrote: > kann. Aber das wesentliche Feature, was ihm fehlt, ist dass es > keine "COME FROM"-Anweisung gibt. Das stimmt. Dazu müßte man den default Handler per CALL anspringen und dort dann: POP Zh POP ZL Schon wüßte man, wer der Übeltäter ist. Peter
Jörg Wunsch wrote: > ... Aber das wesentliche Feature, was ihm fehlt, ist dass es > keine "COME FROM"-Anweisung gibt... Hehehe.... Hat schon jemand InterCal auf den AVR portiert?
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.