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
Das ist dokumentiert (mitsamt Begründung): http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/FAQ.html#faq_reg_usage Es ist folglich sinnvoller, unsigned char zurückzugeben.
@Joerg. Danke. Da steht aber nur, daß es so ist, aber nicht warum. Peter
Doch: um die Möglichkeit der Benutzung der wortorientierten Befehle auf dem »enhanced core« (ATmega* außer 103) zu verbessern.
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
Hmm, hast recht. Frag ansonsten mal auf der avr-gcc Liste, aber um Marek Michal
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.