Forum: Mikrocontroller und Digitale Elektronik Globale Variable in Interruptfunktion + 3000 Bytes Program


von C. H. (hedie)


Lesenswert?

Hallo zusammen

Ich habe folgenden Code:
1
/*
2
 * main.c
3
 *
4
 *  Created on: 25.02.2012
5
 *      Author: darkhedie
6
 */
7
8
#include <avr/io.h>
9
#include <util/delay.h>
10
#include <avr/interrupt.h>
11
12
volatile unsigned char ucDelay = 0;
13
14
#define   Out_0    PORTB &= ~(1<<PB3);
15
#define   Out_1    PORTB |= (1<<PB3);
16
17
ISR(PCINT0_vect)
18
{
19
  unsigned char ucTest = 0;
20
  ucDelay++;
21
        ucTest = ucDelay; //// Mit diesem werden 3000Bytes angehängt
22
23
  _delay_ms(ucTest );
24
  Out_1;
25
  _delay_ms(250);
26
  Out_0;
27
28
}
29
30
31
int main(void)
32
{
33
  DDRB = 0xFB;
34
35
  GIMSK |= (1<<PCIE);    //Interrupt Aktivieren
36
  PCMSK |= (1<<PCINT2);
37
  sei();
38
39
40
  while(1)
41
  {
42
43
  }
44
}


Wenn ich im Interrupt auf die Globale Variable umkopieren oder direkt 
der DelayFunktion übergeben möchte, so fügt der Compiler der Program 
Section mal eben 3000 Bytes an.

Woran kann das liegen?

Danke schonmal

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daran, daß die Delay-"Funktion" mit Floatingpoint-Arithmetik arbeitet. 
Das macht solange nichts, wie sie mit einer Konstanten aufgerufen wird, 
da rechnet der Compiler das aus. Wenn sie aber mit einer Variablen 
aufgerufen wird, kann das der Compiler nicht, sondern erzeugt Code, der 
das zur Laufzeit berechnet.

von C. H. (hedie)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Daran, daß die Delay-"Funktion" mit Floatingpoint-Arithmetik arbeitet.
> Das macht solange nichts, wie sie mit einer Konstanten aufgerufen wird,
> da rechnet der Compiler das aus. Wenn sie aber mit einer Variablen
> aufgerufen wird, kann das der Compiler nicht, sondern erzeugt Code, der
> das zur Laufzeit berechnet.

Vielen Dank für deine Antwort :)

Gibt es eine Delay Funktion welche ohne Floatingpoint arbeitet?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wohl nicht.
Allerdings: Welchen Sinn hat der Aufruf einer Delayfunktion
im Interrupt-Handler? Das ist ein Designfehler.

von C. H. (hedie)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wohl nicht.
> Allerdings: Welchen Sinn hat der Aufruf einer Delayfunktion *im
> Interrupt-Handler*? Das ist ein Designfehler.

Hmmm ja da hast du wohl recht :)

Danke :)

von Uwe (de0508)


Lesenswert?

Hallo Claudio,

lösche das delay aus der ISR und verwendet einen Trigger oder Semaphore 
Variable, so dass in der  Main - while(1) { }  das Ereignis verarbeitet 
werden kann.

von Rolf M. (rmagnus)


Lesenswert?

Claudio Hediger schrieb:
> Gibt es eine Delay Funktion welche ohne Floatingpoint arbeitet?

Es gibt die Delay-Funktionen, die im Manual der avr-libc dokumentiert 
sind. Da sind auch welche ohne Floatingpoint dabei.

von Marcus O. (marcus6100)


Lesenswert?

Claudio Hediger schrieb:

> Gibt es eine Delay Funktion welche ohne Floatingpoint arbeitet?

Kannst du selbst schreiben, ist aber vom Overhead der Funktionsaufrufe
und der gesuchten Genauigkeit abhängig. z.B.:

void delay_ms(uint16 ms)
{
  ms >>= 2;
  while (ms--)
    _delay_ms(4);
}

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.