Allgemeine Frage: Variablen (unsigned int) vom main und Interrupt

Gast #2046687
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
#2046695
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.
Gast #2046708
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
#2046709
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.