-
        

Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 51

Thema: einige Fragen zu Grundlagen der C-Programmierung

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    einige Fragen zu Grundlagen der C-Programmierung

    Anzeige

    Hi,
    ich mach gerade das mir empfohlene Tut durch und kapier einiges nicht:
    1. Was ist ein Register?
    2. ein Code-Beispiel aus dem Tut:
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    uint8_t foo;
    
    int main (void) {
       foo = PINB;
    }
    Warum werden die Packete io.h aud stdint.h hinter # eingebunden? Ich dachte # markiert Kommentare !?

    Warum gibt main ein int zurück? Ich komme von Java, und da gibt main nix zurück, warum auch !? Andereseites steht in Klammern "void", was bei Java heißt, dass eine Methode nix zurückgibt. (das versteh einer :S)

    Was soll dieses PINB ? Ist das ne Variable, die in dem Codeausschnitt nicht definiert wurde, oder eine feste Variable aus einem der Packete? Hä?

    Hmm, ich glaubt das wäre es bis jetzt. Mehr fällt mir im Moment nicht ein.
    Ich hoffe ihr könnt meinem verwirrten Gehirn helfen.

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    ups,
    sorry ich gebe Dir noch ein Link zu C allgemein : hier ist ein Openbook "C von A bis Z", und hier ist noch
    ein Tutorial zu C unter Linux.
    Dort findest Du Antworten auf die meisten Fragen.

    Gruß Sebastian

    EDIT: Ich sehe gerade, der erste Link geht nicht direkt einfach auf "Open Books" und dann "C von A bis Z" drücken

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    also dein Link zu C allgemein funktioniert nicht. Aber der andere hilft mir bestimmt schon.
    Danke!
    mfg
    jagdfalke

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ich hab jetzt schon 4 Tage von dem Tut durch, aber meine Frage wurden noch nicht beantwortet.
    btw: kann der AVR Rekursion? (ist ja sehr ram-intensiv)

    Was bedeuten immer diese "%d" ?? Das wurde auch noch nicht erklärt, aber ständig benutzt.

    mfg
    jagdfalke

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.10.2004
    Ort
    Rheinstetten
    Alter
    34
    Beiträge
    357
    %d ist ein Platzhalter für einen Double-Wert.
    PINB ist wohl irgendeine Registeroperation, bei der irgendein Byte rumgeschoben wird

    Das ganze wird hinter # eingebunden, weil das in C so ist.

    Die wichtigsten Dinge, die hinter einer # sind:
    #include <package.h>
    und
    #define konstante wert

    Ein Register ist ein Speicher für eine Zahl in deiner Hardware.

    Zu deiner Frage mit der Rekursion: probier's aus. Normalerweise sollte es funktionieren. Ich weiss auch nicht ob der Compiler automatisch rekursionen auflöst...Aber ich denke, es geht. Probiers.

    Ich komme auch aus der Java-Welt und tue mir mit C etwas schwer. Such dir doch ne Java VM für deinen µC...
    Unwissenheit ist ein Segen

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    @maze2k,
    ich will Dich ja nicht beleidigen, aber bevor Du sowas postest, poste lieber garnichts!

    Gruß Sebastian

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Ich versuche mal, Deine Fragen ausführlich zu beantworten:

    1) Was ist ein Register?
    Über Register wird ein µP eingestellt bzw. der µP stellt Informationen darüber zur Verfügung. Im Prinzip ist es nichts anderes als Speicherplatz auf bestimmten Adressen im internen RAM des Prozessors.
    Es gibt z.B. ein Register DDRB (Data Direction Register B). In diesem Register kannst Du einstellen, welche Pins von Port B als Eingänge und welche als Ausgänge benutzt werden. Am besten schaust Du mal ins Datenblatt Deines AVRs, dort sind alle Register ausführlich beschrieben.

    2) - In C beschreibt '#' eine Compiler-Anweisung. Ein Kommentar ist entweder // (einzeilig) oder /* kommentar */ (mehrzeilig).
    - Manche C-Compiler wollen von der main-Funktion einen Rückgabewert haben. Keine Ahnung warum, ist einfach so. Stör Dich nicht weiter dran.
    In den Klammern stehen ein oder mehrere Werte, die der Funktion als Parameter übergeben werden. Die main Funktion bekommt keine Parameter, also steht void drin.
    - PINB ist ein Makro für Register. Die Definitionen der Register-Makros stehen in der io-Bibliothek Deines AVRs, die über die io.h eingebunden wird. PINB ist das Eingangsregister für Port B. Mit diesem Programm liest Du also den Zustand der Eingänge an Port B in die Variable foo ein.

    Gruß,
    askazo

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Danke askazo, das hat mir schon sehr geholfen.
    Eine Frage noch:
    Mit diesem Programm liest Du also den Zustand der Eingänge an Port B in die Variable foo ein.
    Mich verwundert der Plural etwas: Wie kann man mehrerer Zustände in einer uint8_t-Variable speichern?

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Der Typ uint8_t ist 8 Bit groß.
    Der Port B hat 8 Eingänge, das Register PINB ist ebenfalls 8 Bit groß.
    Jedes Bit steht für den Zustand eines Eingangs, also kannst Du alle 8 Eingangszustände in foo speichern.

    askazo

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801

    Re: einige Fragen zu Grundlagen der C-Programmierung

    Zitat Zitat von jagdfalke
    Warum werden die Packete io.h aud stdint.h hinter # eingebunden? Ich dachte # markiert Kommentare !?
    Kommentare in C werden mit /* begonnen und mit */ wieder beendet. Es gibt auch die Kurzform // um bis zum Zeilenende auszukommentieren, aber das ist kein ANSI-C. Geht aber mit avr-gcc (ohne Option -ansi natürlich )

    # gehört eigentlich nicht zu C. Das kennzeichnet Präprozessor-Dirktiven wie

    #include
    #define
    #undef
    #if
    #ifdef
    #else
    #endif
    #error
    #warning
    #pragma

    Bevor der eigentliche Compiler zum Zuge kommt rauscht ein Präprozessor über die Quelle und macht Textersatz.

    Wenn du zB hinschreibst PINB (ein in avr/ioxxxx.h definiertes Makro), macht der Präprozessor so was draus:

    (*(volatile uint8_t *)((0x16) + 0x20))

    Für nen Compiler ist das verständlich, für Menschen weniger. Es bedeutet so viel wie "Inhalt der Speicherstelle an Adresse 0x36". An dieser Adresse liegt das ober werklärte PINB-Register -- zumindest beim ATMega8. Über das Makro PINB kann man besser leserlich auf dieses Register zugreifen.

    Zitat Zitat von jagdfalke
    Warum gibt main ein int zurück? Ich komme von Java, und da gibt main nix zurück, warum auch !? Andereseites steht in Klammern "void", was bei Java heißt, dass eine Methode nix zurückgibt. (das versteh einer :S)
    In Java bedeutet das nicht, daß eine Funktion nix zurückgibt, sondern daß sie keine Parameter hat. In C ist das genauso. main() hat keine Eingabeparameter -- woher auch.
    main() gibt allerdinge einen int zurück. Das ist Konvention in C, um Werte an eine shell zurück zu liefern. In Java müsste man das mit System.exit(xxx) machen. Auf einem embedded System läuft keine shell, daher ist das return int unnötig. Wenn man aber hinschreibt

    void main()

    bekommt man eine lästige Compiler-Warnung. Diese vermeidet man mit der gcc-Option -ffreestanding, die sagt, daß das Programm alleine läuft, also nicht in einer Umgebung mit shell.

    Zitat Zitat von jagdfalke
    btw: kann der AVR Rekursion? (ist ja sehr ram-intensiv)
    Der AVR kann alles, was ein Compiler ihm in der Lage ist zu verklickern
    Für avr-gcc heisst das: Rekursion geht.
    Speicherverbrauch ist ein kritisches Thema auf nem Hänfling wie AVR. Da muss man schon ein Auge drauf haben...
    Disclaimer: none. Sue me.

Seite 1 von 6 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •