Forum: Mikrocontroller und Digitale Elektronik glob. Variablendefinition (AVR-C)


von Hegy (Gast)


Lesenswert?

Hallo,

eine Frage zur Deklaration/Definition von globalen Varaiblen hätte ich
da. Die Sache ist die, daß ich vom Compiler immer die Warnung

warning: passing arg 1 of `UART_puts_l' discards qualifiers from
pointer target type

bekomme.

Im Detail sieht's so aus: Eine globale Variable soll in einer ISR
gelesen werden können und in einer anderen Funktion beschrieben werden
können, nicht müssen, d. h. daß diese Variable zum Programmstart
initialisiert wird.

So:
1
static volatile unsigned char textentry[5] = {0x45, 0xF0, 0x00, 0x12,
2
0x6E}; // default Werte
3
4
UART_puts_l(char *out, unsigned char length)
5
{
6
  length++;
7
  while(length > 0)
8
  {
9
    UART_putc(*s++);
10
    length--;
11
  }   
12
}
13
14
15
ISR(SIG_OUTPUT_COMPARE1A)
16
{
17
  if(value)
18
    UART_puts_l(textentry, 5);
19
}
20
21
22
void change_textentry(void)
23
{
24
  // Variable textentry mit anderen Werten beschreiben
25
}
Wenn ich in der 1. Zeile das 'volatile' weglasse ist alles ok, aber
das wäre ja meiner Meinung nach Humbug.

Wie macht man's richtich?

Gruß von
  Hegy

von Stefan K. (_sk_)


Lesenswert?

So:
  UART_puts_l(volatile unsigned char *out, unsigned char length)

Überleg mal, was Du mit dem volatile bezwecken willst. Die Eigenschaft
"volatile" muss ja vom Code irgendwie umgesetzt werden - deswegen
musst Du sie einem Funktionsaufruf auch mitgeben.

Sonst wird die volatile-Variable in UART_puts_l behandelt wie eine ganz
normale Variable - und das wäre u.U. falsch.

Übrigens:
1
ISR(SIG_OUTPUT_COMPARE1A) {
2
 if(value)
3
    UART_puts_l(textentry, 5);
4
}
Wenn innerhalb einer ISR-Routine eine andere Funktion aufgerufen wird,
dann sichert gcc oft wesentlich mehr Register als bei einer ISR ohne
Funktionsaufruf. Deshalb würde ich so eine kleine Funktion direkt in
die ISR schreiben. Schau Dir mal den Assembler-Output an, welche
Unterschiede das regibt.

Gruß, Stefan

von Stefan (Gast)


Lesenswert?

Warnt dich dein Compiler eigentlich, dass out in UART_puts_l() nicht
benutzt wird bzw. s undefiniert ist?

von Hegy (Gast)


Lesenswert?

Ähmmm, nö, tut er nicht, weil ich in den hiereingestellten Code
rumgefuttgert. Es sollte auch heißen
1
UART_puts_l(char *s, unsigned char length)
2
{
3
  length++;
4
  while(length > 0)
5
  {
6
    UART_putc(*s++);
7
    length--;
8
  }
9
}

Zum Funktionsaufruf innerhalb einer ISR, damit bin ich überhaupt nicht
mit zufrieden. Normalerweise sollte eine ISR kurz & knakkig sein, aber
der Funktionsaufruf, in diesem Falle UART_puts_l(), ruft wieder eine
Funktion auf (UART_putc()). Wie ließe sich das lösen? Alles in die ISR
reindängeln?

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.