Moin, ich hab grad was entdeckt. Die ganz neuen AVR (zb Mega168 oder Tiny2313) haben eine nette Funktion. Man kann einen Ausgang auf einfache Weise Togglen (umschalten). Man muß dazu nur in das entsprechende PINX Register eine 1 schreiben. Das geht aber nur bei den ganz neuen AVR, Mega8, 16 und 32 zb können das nicht. Vielleicht schnappt das ja der eine oder andere Compilerbauer auf und kann das als Optimierung implementieren
Cooler Hinweis! Danke! Mehr Infos dazu z.B. im Datasheet von Atmega48/88/168 Kapitel 12.2.2 (Toggling the Pin). Also eine '1' ins PINxn Register togglet das jeweilige PORTxn Bit unabhängig vom DDRx Register. Je nach DDR schaltet man damit den Pin zwischen low und high (0/1) oder zwischen Hochohmig und Pullup (Z/PU) hin und her. Damit lassen sich manche Dinge echt beschleunigen. Hoffentlich findet das Einzug in den winavr! joern g.
> Hoffentlich findet das Einzug in den winavr!
Nun, da winavr frei ist und von gcc kommt, wird es wohl Jahrhunderte
dauern, bis das aufgenommen wird.
Hi, hatte das schon vor einer graumen Zeit im GCC Forum gepostet. Inzwischen gab es schon eine WINAVR Version. Leider nutzt diese immer noch nicht die Funktion :/ Gruß, Dirk
Wie willst Du denn einen C-Befehl formulieren, der diese Optimierung nutzen könnte? Etwa: PORTB^=(1<<Bit7) dann müsste der Compiler Ports und interne Register unterschiedlich behandeln und das auch noch in Abhängigkeit vom genauen Prozessortyp. Da glaub ich nicht dran... Aber schreib dir doch ein Makro: #define PIN(x) (*(&x - 2)) /* address of input register of port x */ #define toggle(port,data) PIN(port)=data dann schreibst Du toggle(PORTB,(1<<Bit7)) und der Compiler macht, was Du willst. Vorrausgesetzt, die Regel stimmt noch, dass das PINx-Register immer genau 2 Adressen unter dem PORTx-Register ist, das hab ich jetzt nicht im Datenblatt nachgeschaut.
Hi, >PORTB^=(1<<Bit7) dann müsste der Compiler Ports und interne >Register unterschiedlich behandeln und das auch noch in Abhängigkeit >vom genauen Prozessortyp. Normal dachte ich immer das dafuer Compiler da sind. Um z.B. deinen C Code in den kuerzesten ASM Code zuwandeln. Gruß, Dirk
Ein guter Compiler macht sowas auch, der kostet dann aber eben ein paar kuro...
in den kürzesten oder schnellsten, je nach eingeschalteter Optimierung. Aber was soll so ein Universalcompiler, wie der gcc noch alles berücksichtigen? Schau dir mal den erzeugten Assemblercode an und überlege wieviele weitaus nützlicheren Optimierungen dir auf den ersten Blick einfallen... Und bei hardwarenaher Programmierung finde ich es überhaupt nicht schlimm, wenn man solche Dinge von Hand macht. Ausserdem leidet die Portierbarkeit von Programmcode bei Ausnutzung von solchen Features. Gruß Uwe
> Ausserdem leidet die Portierbarkeit von Programmcode bei > Ausnutzung von solchen Features. Gerade das ist ja der Grund, warum der Compiler das autmatisch machen sollte. Er weiß durch -mmcu genau, für welchen Mikrocontroller der Code erzeugt werden soll und ob dieser das Feature hat oder nicht. Wenn ich es von Hand nutzen will, wird mein Code dadurch prozessorabhängig, und zudem bekomme ich bei einem Prozessor, der es nicht unterstützt, keinen Fehler vom Compiler, sondern es funktioniert nur einfach nicht mehr. Alternativ müßte man das Makro in #ifdef-Verhaue einbetten, um dort prozessorabhängig für die richtige Wahl zu sorgen.
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.