mikrocontroller.net

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


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
static volatile unsigned char textentry[5] = {0x45, 0xF0, 0x00, 0x12,
0x6E}; // default Werte

UART_puts_l(char *out, unsigned char length)
{
  length++;
  while(length > 0)
  {
    UART_putc(*s++);
    length--;
  }   
}


ISR(SIG_OUTPUT_COMPARE1A)
{
  if(value)
    UART_puts_l(textentry, 5);
}


void change_textentry(void)
{
  // Variable textentry mit anderen Werten beschreiben
}

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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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:
ISR(SIG_OUTPUT_COMPARE1A) {
 if(value)
    UART_puts_l(textentry, 5);
}
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

Autor: Stefan (Gast)
Datum:

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

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähmmm, nö, tut er nicht, weil ich in den hiereingestellten Code
rumgefuttgert. Es sollte auch heißen
UART_puts_l(char *s, unsigned char length)
{
  length++;
  while(length > 0)
  {
    UART_putc(*s++);
    length--;
  }
}

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.