Codevorschlag Lauflicht?

Gast #39425
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
Gast
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
Gast
wenns beim größenvergleich ehrlich sein soll, sollte man die wait 
funktion vielleicht als inline deklarieren. und optimierungen nicht 
vergessen!
Gast
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.
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.