Forum: Compiler & IDEs Codevorschlag Lauflicht?


von Maik Schmidt (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Jonas Diemer (Gast)


Lesenswert?

wenns beim größenvergleich ehrlich sein soll, sollte man die wait 
funktion vielleicht als inline deklarieren. und optimierungen nicht 
vergessen!

von Joerg Wunsch (Gast)


Lesenswert?

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.

von Maik Schmidt (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.