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

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.