Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Dienstag, 9. Dezember 2008, 11:13

Unterbrechen eines Befehls durch ISR

Hallo,

ich habe eine Frage bezüglich des Befehls um einen Pin zu setzen:
PORTB |= _BV(PB2); // 2 Takte

Wird der Atmel diesen Befehl in einen load und set Befehl letztendlich umformen?

[ PORTB |= _BV(PB2) <=>sbi... <=> laden und setzen <=> LDI R1,x + MOV R2,R1 ]

Gruß speedo

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »speedo7« (9. Dezember 2008, 14:15)


2

Dienstag, 9. Dezember 2008, 14:16

Hi,

ISR unterbricht das Hauptprogramm in dem Augenblick wenn er auftritt!
C speichert aber im ISR genutzte Register auf dem Stack. Du merkst davon also nichts im Hauptptogramm.
Wenn Du also vorm ISR eine Portregister lädst und im ISR dem Port veränderst ist das für das Hauptprogramm nicht zu erkennen. Deshalb sperrt man vor solchen speziellen Stellen kurz die ISR und gib danach wieder frei.
Willst du Variablen im Hauptprogramm und im ISR nutzen sind diese als volatile zu deklarieren.

Gruß Sven

bone

RCLine User

Wohnort: D - KA

Beruf: Dipl.-Ing (Embedded Hard-/Software - Entwickler)

  • Nachricht senden

3

Mittwoch, 10. Dezember 2008, 23:43

Zitat

Original von sven.stoecker

Willst du Variablen im Hauptprogramm und im ISR nutzen sind diese als volatile zu deklarieren.

Gruß Sven


volatile ist zunächst mal nur eine anweisung an die optimierungsstufen des compilers. volatile sagt aus, das es sich hier um eine variable handelt, die auch ausserhalb der aktuellen sichtbarkeit (innehallb der funktion, anweisungsblock...) verändert werden kann, UND somit nicht wegoptimiert werden darf, bzw. nicht zu einem geringwertigeren datentyp gecastet werden soll...

variablen, die beispielsweise durch die hardware verändert werden können (peripherie-register zb), oder triviale iteratoren
zb:

int iterator;
for(iterator = 0; iterator < 100; iterator++)
;

je nach optimierung wird dieses gebilde, das für uns wohl den sinn hat zeit zu schinden als parasitär angesehen und schlicht weggeworfen.
hingegen die deklaration:

volatile int iterator;

würde bewirken, das alles fein säuberlich übersetzt wird.


Um jedoch variablen aus dem laufenden program auch in interrupt service routinen anzusprechen mussen diese lediglich sichtbar im scope des interrupts sein (global definiert)

ebenfalls Gruß Sven
Was ist das:
Es wird mit 300Knochen geboren, hat aber Ausgewachsen nur noch 206.
Es atmet immer nur durch ein Nasenloch; etwa alle 15 Minuten findet ein Wechsel statt.
Beim Niesen werden alle Körperfunktionen ausgesetzt,sogar das Herz.
hcsnem nie

4

Donnerstag, 11. Dezember 2008, 10:46

Hi,

>würde bewirken, das alles fein säuberlich übersetzt wird.

etwas komisch Erklärung, die darauf schießen lässt das Du nicht weißt was der Compiler wirklich tut! Sorry.

Der Copiler hält Variablen im S-Ram und lädt die bei Benutzung in ein Register. Wird ein Variable mehrmals hintereinander genutzt, greift der Compiler weiter auf die Register und nicht auf den S-Ram zu.
Volantile erzwingt das ständige neuladen aus dem S-Ram und hat nicht mit der Wegoptmierung sinnloser Schleifen zu tun

> mussen diese lediglich sichtbar im scope des interrupts sein (global definiert)

Dann kanns aber immer noch sein, dass beide die Variable kennen, aber dasHauptprogramm die Änderung erst später bemerkt.

die eigentliche Fragestellung war aber ob im obigen Konstrukt die Änderung des Ports übersehen wird. Antwort ist JA.
Und deshalb Interupt sperren/freigeben.

Gruß Sven

bone

RCLine User

Wohnort: D - KA

Beruf: Dipl.-Ing (Embedded Hard-/Software - Entwickler)

  • Nachricht senden

5

Donnerstag, 11. Dezember 2008, 18:03

habs verstanden ;)
Was ist das:
Es wird mit 300Knochen geboren, hat aber Ausgewachsen nur noch 206.
Es atmet immer nur durch ein Nasenloch; etwa alle 15 Minuten findet ein Wechsel statt.
Beim Niesen werden alle Körperfunktionen ausgesetzt,sogar das Herz.
hcsnem nie

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bone« (11. Dezember 2008, 18:09)


6

Sonntag, 14. Dezember 2008, 11:31

Danke Euch.