Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage: Variablen (unsigned int) vom main und Interrupt


von Detlev Neumann (Gast)


Lesenswert?

Hallo Zusammen,

ich habe da mal eine generelle Frage,

nehmen wir an ich deklariere mir eine eine globale variable als
unsigned int die heißt timeout. Nun läuft in meinen AVR programm ein
genereller Softwaretime
1
ISR (TIM1_OVF_vect)    
2
{
3
      TCNT0=0x67;         // Timer für 1 msec vorsetzen
4
5
      SEI(); 
6
7
  if(timeout > 0)    // Erhöhe Software-Clock-Zähler, 
8
  {
9
     timeout--;    // solange Höchstwert nicht erreicht ist
10
  }  
11
12
}

Im Main setzt ich jetzt dentimeout wert aof sagen wir 300
und wart in einer while schleife bis der Wert null ist. Es
läuft noch ein weiterer interrupt in der Maschine der ist nicht
unterbrechbar. Jetzt meine Frage, ein schreiben einer 16Bit Variable
passiert nicht in einem prozessor zyklus, kann es bei der konstellation
zu falsch interpretaionen kommen des 16 bit wertes kommen? Main oder 
interrupt. muss ich dieses bei dem zugriff sperren? Wenn ja wie mach ich 
das in einer Warteposition


Gruß

Detlev

Danke

von Karl H. (kbuchegg)


Lesenswert?

Detlev Neumann schrieb:


> unterbrechbar. Jetzt meine Frage, ein schreiben einer 16Bit Variable
> passiert nicht in einem prozessor zyklus,

genau

> kann es bei der konstellation
> zu falsch interpretaionen kommen des 16 bit wertes kommen?

Natürlich

> Main oder
> interrupt. muss ich dieses bei dem zugriff sperren?

in main().

Im Interrupt kann das Schreiben und Lesen ja sowieso nicht unterbrichen 
werden. Da sind weitere Interrups ja sowieso gesperrt.

> Wenn ja wie mach ich
> das in einer Warteposition

Was meinst du damit?
Im schlimmsten Fall muss man sich eben unter INterruptsperre den 
kompletten Wert in eine lokale Variable holen, kann dann die Interrupts 
wieder freigeben und mit der lokalen Kopie des Wertes weiterarbeiten.

von Oliver J. (skriptkiddy)


Lesenswert?

Schau dir mal die *atomic.h* an.

von Detlev Neumann (Gast)


Lesenswert?

Hallo Karl-Heiz,

>Im schlimmsten Fall muss man sich eben unter INterruptsperre den
>kompletten Wert in eine lokale Variable holen, kann dann die Interrupts
>wieder freigeben und mit der lokalen Kopie des Wertes weiterarbeiten.

Diesen Teil verstehe ich noch nicht ganz

Sagen wir mein main sieht wie folgt aus.
1
while(1)
2
{
3
4
 if (fehler)
5
 timeout = 300
6
 ......
7
 while(timeout)
8
 .......
9
10
11
}

   SEI(); ist ein MAKRO und macht meinen Interrupt unterbrechbar.

wie soll ich jetzt timeout schutzen so das ich es nicht durch zwei 
Seiten zeitgleich anfasse?

Danke

Detlev

von Karl H. (kbuchegg)


Lesenswert?

Detlev Neumann schrieb:

> Diesen Teil verstehe ich noch nicht ganz
>
> Sagen wir mein main sieht wie folgt aus.
>
>
1
> 
2
> while(1)
3
> {
4
> 
5
>  if (fehler)
6
>  timeout = 300
7
>  ......
8
>  while(timeout)
9
>  .......
10
> 
11
> 
12
> }
13
>

1
   ....
2
3
   cli();
4
   localTimeout = timout = 300;
5
   sei();
6
7
   while( localTimeout ) {
8
     cli();
9
     localTimeout = timeout;
10
     sei();
11
   }
12
13
   ...

anstelle von sei und cli kann man natürlich auch die von Skript Kiddy 
angesprochenen Makros sinnvoll einsetzen. Das Prinzip bleibt aber das 
gleiche.

von Detlev Neumann (Gast)


Lesenswert?

Sorry Ich meine Karl-Heinz

Und danke Skript Kiddy

genau das

>Schau dir mal die *atomic.h* an.

beantwortet meine Frage

Danke euch

Detlev

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