- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Programmsturkturierung mit .c Files und .h files

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2006
    Alter
    36
    Beiträge
    150

    Programmsturkturierung mit .c Files und .h files

    Anzeige

    E-Bike
    Hallo!

    Hab eine Frage bezüglich der Programmsturkturuerung.
    Hab mir mal früher eine Bibliothek gemacht (.c, .h File) mit der ich einen Sensor anspreche.
    Und jetzt will ich die wieder verwenden und frag mich wie ich das mit den H-Files am besten mache.
    Also im sensor.h stehen Name für Pins
    wie #define D LATabits.LATA0, und eben Konstanten zum ansprechen. Genauso stehts mit meiner LCD-Bibliothek.
    Und jetzt wollt ich ein neues Projekt machen und mir die alten Funktionen holen und dachte mir mal in die neue Main alle Pinbschreibungen, weil die sind ja projektspeziefisch immer anders.
    Aber dann passen die namen mit den anderen .h und .c files nicht mehr zusammen oder sind doppelt deklariert.
    Wie ordnet man das am besten. Weil, wenn ich es über main.h mache ist die jeweilige Bibliothek für sich nicht lebensfähig.
    Also umrundet gesagt: Wie ist da die gute Struktur?

    Und noch was. Ich hab eine Sensorfunktion und drei Sensoren am µC. Wie sag ich da, das die Funktion zuerst die 2 Pins verwendet und dann die anderen 2 und dann die letzten 2? Kann man irgendwie der funktion, die Pins mitübergeben?

    lg,
    theo

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Wenn ich das richtig verstehe, hast du dir für deine Sensorabfrage ein .c File gebastelt, in dem deine Funktion steht. Die zugehörigen Portfestlegungen stehen im sensor.h File. Dann musst du in deinem Projekt die .c ins make aufnehmen. Die Headerdatei ist dafür da, dass man dort spezifische Festlegungen hinterlegt. Wenn sich also die Pinbelegung ändert, dann sollte das dort abgelegt werden.

    Deine Funktion sollte einfach um 3 Parameter erweitert werden. z.B.
    uint8_t get_sensor(uint8_t portnummer, uint8_t sensorBit1, uint8_t sensorBit2)
    {
    ... if (portnummer & (1 << sensorBit1)) ...
    }

    sast

    雅思特史特芬
    开发及研究

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2006
    Alter
    36
    Beiträge
    150
    Also das heißt das passt schon so, dass die Portspezifikationen im jeweiligen .h File stehen. Aber dann ist das .h File jedesmal anderst also bei jedem Projekt anders... ??
    Und zu der Sensorabfrage. Ja so in etwa läuft das, aber das mit der if-abfrage ist eigentlich auch das ich eine Funktion drei mal schreibe ... quasi.
    Ich meinte eher die Funktion so wie sie ist belassen und nur durch die Parameter dann den jeweiligen Port den jeweiligen Namen zuweisen.

    Also so:

    get_data(int portnummer)
    {
    if(portnummer == 1)
    {
    #define D LATAbits.LATA0
    #define SCK LATAbits.LATA1
    }
    if(portnummer == 2)
    {
    #define D LATAbits.LAT2
    ....
    }
    ....//3 Sensor

    //normale Funktion die fertig ist und mit D und SCK arbeitet
    }

    Also so hab ich mir das gedacht, aber ich nehm stark an das das mit #define das ich ja in den .h Files mache später oder eben da wo ichs einsetzen will und das ständig veränderlich nicht funktioniert. Also ich hoff es ist klarer, weil dann ist die Funktion nur einmal da und nicht drei mal und es sind nur die Ports andere, aber sonst ist ja alles gleich.

    lg,
    theo

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Für die Aufteilung gibt es ein recht gut durchdachtes System, allerdings nur als "freiwillige" konvention, nicht als Teil der Sprache C. Ich kann leider die Webseite nicht wiederfinden wo das gut erklärt war.

    Ein Punkt ist, das die .H files testen sollten ob sie schon eingebunden sind und dann ggf. nichts machen. Dazu dient der Typischen anfang mit #ifdef ...

    Zu den meisten .c files gehört dann ein .h file, wobei der .c file auch das passende .h file einbindet, damit die Namen in beiden Files gleich sind.

    Ins .h file gehören Definitionen von Konstanten, Typen, globale Variablen, #defines und Prototypen von Funktionen, aber keine eigentlichen Funktionsdefinietionen. Höchstens funktionen mit dem Zusatz "static inline" machen noch im .h file Sinn.
    Zum .H file selber wird also noch keine code erzeugt. Damit sollte es reichen das .h file per include einzubinde.


    Die .c Files enthalten den eigentlichen Code, sollten aber nicht selber eingebunden werden müssen.

    Kurzgefaßt, sollte das .h files nur das enthalten was nötig ist, damit es reicht das .h file per #include einzubinden. Das .c files sollte lieber das .h file per include einbinden als etwas doppelt zu definieren.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    die Funktion ist immer get_data, aber die Parameter werden beim Funktionsaufruf zutreffend übergeben.
    zB wenn get_data analog zu get_sensor deklariert wurde
    ...
    data1 = get_data(LATA, D1, SCK1);
    data2 = get_data(LATA, D2, SCK2);
    ...

    portnummer ist eigentlich nur der µC Port wie zB PORTB.

    Du kannst das ganze natürlich auch für jeden Sensor in ein struct schreiben und dann nur einen Parameter übergeben

    typedef struct sensor{
    uint8_t port;
    uint8_t pinD;
    uint8_t pinSCK;
    } sensor_t;

    sensor_t sensor1, sensor2, sensor3;

    sensor1.port = PORTB;
    sensor1.pinD = PB0;
    sensor1.pinSCK = PB1;
    ...

    ... get_data(sensor1);
    ...

    sast

    雅思特史特芬
    开发及研究

Berechtigungen

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

Solar Speicher und Akkus Tests