Forum: Compiler & IDEs include .h .c code auslagern


von Sven (Gast)


Lesenswert?

Hallo,

ich programmiere einen ATmega32 mit dem AVR-GCC Compiler, das klappt 
auch ganz gut. Bisher habe ich allerdings den gesammten Code immer in 
eine Datei geschrieben, dass wird mit der Zeit aber unübersichtlich 
(viele Funktionen). Seit einigen Tagen beschäftige ich mich damit Code 
entsprechend der Funktionen "auszulagern" - also die Ansteuerung des 
Grafikdisplays etc. Ich habe aber ziemliche Probleme damit, mich auch in 
das Thema eingelesen aber es klappt nicht.

Konkret: Ich möchte meine Funktionen zum Ansteuern des Grafikdiplays als 
hd610202.h und hs61202.c "includen". Also habe ich in der Datei 
hd61202.h die Ports, Pins und die Funktionen als Prototypen deklariert. 
In der Datei hs61202.c stehen dann die jeweiligen Funktionen zum 
Ansteuern des Displays. In meinem "main.c"-File steht dann #include 
"hd61202.h" aber der Compiler schluckt das nicht so wie ich mir das 
gedacht habe. Ich glaube ich mache da einen grundsätlichen Denkfehler. 
Ich habe mir viele Beispiele angeschaut und inmeinem Code übertragen, 
aber es klappt nicht.

Vielleicht kann mir jemand einen Tip geben.

: Gesperrt durch Moderator
von ReadTheFineManual (Gast)


Lesenswert?

kann ich da nur sagen.
Ersatzweise Kernighan&Ritchie "The C Programming Language".
Da steht sowas nämlich drin.

Und nein, ich hab keine Lust dir das zu exzerpieren.

von OliverSo (Gast)


Lesenswert?

>Vielleicht kann mir jemand einen Tip geben.

Weiter probieren, oder deinen Sourcecode hier (mit allen Dateien, 
zusammengezippt) einstellen.

Oliver

von Falk B. (falk)


Lesenswert?

@ Sven (Gast)

>Ansteuern des Displays. In meinem "main.c"-File steht dann #include
>"hd61202.h" aber der Compiler schluckt das nicht so wie ich mir das
>gedacht habe.

Der schluckt das schon, wenn du beachtest, dass jede .C Datei einzeln 
übersetzt wird. D.h., in jeder C-Datei müssen alle #inludes rein, auf 
die in der Datei zugrgriffen wird. Z.B. avr/io.h" wird fast überall 
gebraucht, muss also überall rein etc. Und natürlich dann deine eigenen 
.h Dateien.

MfG
Falk

von Sven (Gast)


Lesenswert?

Hallo,

habe mich jetzt das ganze Wochenende mit dem Thema beschäftigt, es geht 
jetzt zwar - aber irgendwie kann das nicht richtig sein (glaube ich).

#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

#define LED_PRT PORTD
#define LED_DIR DDRD
#define LED_PIN PD7

//----------------------------------
// LED einschalten
//----------------------------------
  void LED_ON(void)
    {
    LED_PRT |= (1<<LED_PIN);
    }

//----------------------------------
// LED ausschalten
//----------------------------------
  void LED_OFF(void)
    {
    LED_PRT &= ~(1<<LED_PIN);
    }

//----------------------------------
// Warten (100 x 10 ms = 1 Sekunde)
//----------------------------------
  void WAIT(void)
    {
    uint8_t b0;
    for(b0=0; b0<100; b0++)
      {
      _delay_ms(10);
      }
    }

//----------------------------------
// main function
//----------------------------------
  int main(void)
    {
    LED_DIR=255; // Alle Pins am Port auf Ausgang
    LED_PRT=0;   // Alle Pins auf Low setzen

    for(;;)
      {
      LED_ON();
      WAIT();
      LED_OFF();
      WAIT();
      }

    }

Hier mal ein Beispielcode, das ist das eigentliche Programm (ein 
Beispiel). Jetzt möchte ich gerne die "defines" in der datei led.h haben 
um später nur noch die Datei led.h zu ändern um die Ports zu definieren. 
Die Funktionen LED_ON, LED_OFF und WAIT sollen in der Datei led.c stehen 
um ggf. die Funktionen unabhängig von "main-code" editieren zu können.

Ich hab das auch irgendwie hinbekommen (der Compiler macht es), aber es 
ist dann komischerweise so, wie es in keinem Beispiel ist. Ich habe die 
"defines" in die Datei led.h geschrieben und von der Datei led.h die 
Datei led.c "included" - die Datei led.h wiederum vom Hauptprogramm 
"included". Ich habe nicht, wie in den Beispielen #ifndef und #endif 
verwendet.

Ich hoffe mir kann jemand einen Tip geben, schon mal vielen Dank.

von OliverSo (Gast)


Lesenswert?

In led.h kommt rein:
1
#ifndef LED_H
2
#define LED_H
3
4
#include <inttypes.h>
5
#include <avr/io.h>
6
7
#define LED_PRT PORTD
8
#define LED_DIR DDRD
9
#define LED_PIN PD7
10
11
//----------------------------------
12
// LED einschalten
13
//----------------------------------
14
void LED_ON(void);
15
//----------------------------------
16
// LED ausschalten
17
//----------------------------------
18
  void LED_OFF(void);
19
#endif

led.c:
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include "led.h"
4
5
//----------------------------------
6
// LED einschalten
7
//----------------------------------
8
  void LED_ON(void)
9
    {
10
    LED_PRT |= (1<<LED_PIN);
11
    }
12
13
//----------------------------------
14
// LED ausschalten
15
//----------------------------------
16
  void LED_OFF(void)
17
    {
18
    LED_PRT &= ~(1<<LED_PIN);
19
    }

main.c:
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include "led.h"
5
6
void WAIT(void);
7
8
//----------------------------------
9
// Warten (100 x 10 ms = 1 Sekunde)
10
//----------------------------------
11
  void WAIT(void)
12
    {
13
    uint8_t b0;
14
    for(b0=0; b0<100; b0++)
15
      {
16
      _delay_ms(10);
17
      }
18
    }
19
20
//----------------------------------
21
// main function
22
//----------------------------------
23
  int main(void)
24
    {
25
    LED_DIR=255; // Alle Pins am Port auf Ausgang
26
    LED_PRT=0;   // Alle Pins auf Low setzen
27
28
    for(;;)
29
      {
30
      LED_ON();
31
      WAIT();
32
      LED_OFF();
33
      WAIT();
34
      }
35
    }

makefile:

>SRC = $(TARGET).c led.c

Und ferig.

Oliver

von Sven (Gast)


Lesenswert?

Super, es klappt. Vielen Dank.

von Thomas B. (detritus)


Lesenswert?

Hier wird für Anfänger ganz gut erklärt, wie man ein bestehendes großes 
Projekt in handliche Stücke zerlegt:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=48535&postdays=0&postorder=asc&sid=9098c3a3c0cdfcdafbd8187255136d26

von Martin M. (martin69)


Lesenswert?

Soweit habe ich es kappiert, daß man die C-Files im makefile auflisten 
muß. Ist irgend wie klar, wenn man die Includes auf die *.h-Dateien 
macht. Irgendwie muß der Compiler / Linker ja auch die *.c-Datei finden.

Aber gibt es denn keine andere Möglichkeit als die Modifikation im 
Makefile?

Mich macht das nämlich etwas stutzig: Ich habe ein Makefile früher mal 
von einem anderen Projekt vom Internet kopiert und arbeite schon eine 
Weile damit. Allerdings habe ich die includes auf meine *.c-Dateien 
gemacht, weil es mit den *.h nicht ging. Ist aber ziemlich unschön. 
Jedoch bin ich bisher nicht auf eine andere Lösung gekommen, denn in dem 
von mir verwendeten Makefile gibt es den folgenden Eintrag nicht:

SRC = $(TARGET).c led.c

Auch wenn ich diesen Eintrag in das Makefile rein mache, geht es nicht 
wenn ich die includes auf die *.h-Dateien mache (findet die Dateien *.c 
nicht).
Nur wenn ich ein anderes Makefile verwende, das komplett anders aussieht 
und schon eine Auflistung von C-Dateien drin war, geht es (natürlich 
habe ich dann meine C-Dateien aufgelistet).

Ist schon merkwürdig. Oder hatte das Projekt, von dem ich es kopiert 
habe vielleicht keine Dateien außer main.c?

von ulli_k (Gast)


Lesenswert?

Bei kleinen Einmal-Programmen lassen sich *.c Dateien einfach über den 
Präprozessor auslagern. D.h. einfach betreffendes Codestück in LED.c 
wegspeichern und über #include"LED.c" in main.c einladen.
Der Witz mit dem makefile besteht nur darin, dass in sich fertige 
Programmteile nicht immer wieder übersetzt werden müssen.
Bei kleinen Progrämmchen fällt die Compilerzeit aber kaum ins Gewicht.

von Thomas (Gast)


Lesenswert?

|Mich macht das nämlich etwas stutzig: Ich habe ein Makefile früher mal
|von einem anderen Projekt vom Internet kopiert und arbeite schon eine
|Weile damit. Allerdings habe ich die includes auf meine *.c-Dateien
|gemacht, weil es mit den *.h nicht ging. Ist aber ziemlich unschön.
|Jedoch bin ich bisher nicht auf eine andere Lösung gekommen, denn in dem
|von mir verwendeten Makefile gibt es den folgenden Eintrag nicht:
|
|SRC = $(TARGET).c led.c

Kommt drauf an, wie die Make-Tagets astrukturiert sind. Evtl. gibts da 
auch die Möglichkeit, zu sagen, welche .o er zusammenlinken soll, und 
über eine einzige Anweisung erstellt er diese geforderten .o-Dateien aus 
den vorhandenen .c-Dateien.

|Ist schon merkwürdig. Oder hatte das Projekt, von dem ich es kopiert
|habe vielleicht keine Dateien außer main.c?

Möglich.



|Bei kleinen Einmal-Programmen lassen sich *.c Dateien einfach über den
|Präprozessor auslagern. D.h. einfach betreffendes Codestück in LED.c
|wegspeichern und über #include"LED.c" in main.c einladen.

Ist aber häßlich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Interessiert nach > 1 Jahr aber wohl auch niemanden mehr...

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.