www.mikrocontroller.net

Forum: Compiler & IDEs Typ char wird ignoriert


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem Blick ins Listing habe ich gemerkt, daß der Returnwert immer
als 16Bit erzeugt wird, d.h. der Typ char wird ignoriert.

Muß ich da noch einen speziellen Schalter setzen oder ist das immer so,
daß 6 Byte überflüssiger Code erzeugt werden.


char get_key_press( void )
{
  char i;

  cli();
  i = key_press;                        // read keys
  key_press = 0;                        // clear keys
  sei();
  return i;
}

0000004a <_Z13get_key_pressv>:
  4a:   f8 94           cli
  4c:   80 91 61 00     lds     r24, 0x0061
  50:   10 92 61 00     sts     0x0061, r1
  54:   78 94           sei
  56:   99 27           eor     r25, r25
  58:   87 fd           sbrc    r24, 7
  5a:   90 95           com     r25
  5c:   08 95           ret


Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist dokumentiert (mitsamt Begründung):

http://savannah.nongnu.org/download/avr-libc/doc/a...

Es ist folglich sinnvoller, unsigned char zurückzugeben.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Joerg.

Danke.

Da steht aber nur, daß es so ist, aber nicht warum.

Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch: um die Möglichkeit der Benutzung der wortorientierten Befehle
auf dem »enhanced core« (ATmega* außer 103) zu verbessern.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin wohl zu doof die Stelle zu finden. Ich habe nur gefunden, daß
deswegen geradzahlige Register (R24, R22, R20 usw.) genommen werden:

"All arguments are aligned to start in even-numbered registers
(odd-sized arguments, including char, have one free register above
them). This allows making better use of the movw instruction on the
enhanced core."

Aber nichts, warum R25 auch gesetzt wird.


So wie es aussieht, ist es wohl das beste, grundsätzlich alle
Returnwerte als mindestens "unsigned int" zu definieren. Damit ist
dann die Erweiterung wenigstens nicht doppelt, wenn der Aufrufer das
Ergebnis z.B. zu einem "int" addiert.


Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, hast recht.

Frag ansonsten mal auf der avr-gcc Liste, aber um Marek Michal

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops, sorry, man sollte nicht mehrere Dinge gleichzeitig tun.

Der letzte Teilsatz sollte heißen:

..., aber um Marek Michalkiewicz ist es in letzter Zeit dort auch
recht ruhig geworden.

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.