glob. Variablendefinition (AVR-C)

Gast #408609
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
#408610
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
Gast #408612
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren