Hallo. Ich schreibe gerade an einer Studienarbeit und wollte in selbiger auch einen Größenvergleich von kompilierten C bzw. Assembler-Code machen. 'ne Blinkschaltung war kein Problem, aber ich wollte noch ein Lauflicht haben. Das habe ich als Assembler ohne Probleme hingekriegt, aber irgendwie fehlt mir ein Algorithmus-Ansatz unter C. Ich benutze hier auf einer Testplatine einen AT90S2343 mit intern aktivierter Taktung und fünf LEDs an dem PortB. Falls jemand 'n kleinen Vorschlag hat, wäre ich sehr verbunden, meine C-Kenntnisse sind eh nicht so besonders und ich habe momentan keine Zeit, mich da tiefer einzuarbeiten. MfG, Maik
Hi #include <avr/io.h> void wait(void) { unsigned int i; for(i=0;i<50000;i++); } void main(void) { DDRB=0xFF; PORTB = 1; while(1) { PORTB = (PORTB<<1)|(PORTB>>7); wait(); } } Ist ein Q&D 1min Hack. Sollte aber funktionieren für 8LED's an Port B. Matthias
wenns beim größenvergleich ehrlich sein soll, sollte man die wait funktion vielleicht als inline deklarieren. und optimierungen nicht vergessen!
Der Größenvergleich vergleicht ohnehin Äpfel mit Birnen. Für das bißchen Code fällt der Overhead vom C-Laufzeitsystem einfach zu sehr ins Gewicht. Da keinerlei Interrupts benötigt werden, kann man in der Assembler-Implementierung natürlich auch noch die Vektoren weglassen, während (mit einem nicht modifizierten gcrt1.o) die C-Version immer alle Vektoren belegt. Mit einem ernsthaften Vergleich hat das also kaum was zu tun, dafür sollte man sich schon eine etwas komplexere Aufgabe raussuchen, bei der man außerdem noch den Arbeitszeitaufwand für beide Versionen mit einbeziehen sollte.
Okay, der Vergleich wird vielleicht nicht so gut passen, sehe ich ja ein. Was das kleine Beispielprogramm angeht: kann mir mal irgendwer erklären, wie es funktioniert? @_@ Ich meine, ich sehe, daß hier eine Leerstelle läuft, aber aus dem Vergleich ((PortB kleiner 1) ODER (PortB größer 4)) werde ich nicht schlau (mußte den Wert runtersetzen, ich habe ja nur fünf Ports) MfG, Maik
Hi PORTB = (PORTB<<1)|(PORTB>>7); Hier wird das 1 Bit das vorher reingeschrieben habe immer um 1 Stellt links rotiert. PortB wird also um 1 Bit nach links geschoben und mit dem um 7 Bit nach rechts geschobenen Portb verodert (| bitweises OR, || logisches OR) Dadurch rotiert die 1 immer über den Port. Mach dir die Ausdrücke einzeln klar dann verstehst du auch die Gesamtfunktion. Wenn du nur 5 Stellen willst schreibst du PORTB = ((PORTB<<1)|(PORTB>>4))&0x1F; Ungetestet. Sollte aber funktionieren. Matthias
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.