Forum: Mikrocontroller und Digitale Elektronik ANSI C - .c+.h Verständnisfrage bei CooCox


von soundmachine (Gast)


Lesenswert?

Hallo Leute,

ich habe neu mit CORTEX Prozessoren angefangen und habe dank des "Diller 
Tutorials" schon einige Erfolge erzielt.

Ich habe aber eine Verständnisfrage, die ich mir bisher noch nicht 
einfach verständlich aus dem Netz ziehen konnte. Am Besten mache ich das 
ganze an einem Beispiel fest.
Ich habe mit CooCox ein neues Projekt erstellt. Hierbei habe ich auch 
die entsprechenden benötigten Elemente mit dem Wizard ausgewählt. 
(GPIO/Interrupt etc.)
Nun möchte ich gerne, damit die main.c nicht total unübersichtlich wird 
einzelne Funktionen in einer Datei, nennen wir sie einfach mal 
"Subfunctions.c" auslagern. Was ich aus meiner Schulzeit mit ANSI C noch 
so dunkel weis ist, dass die "Subfunctions.c" erst mal alle 
Unterfunktionen enthält, sowohl die Deklaration, also die Kopfdaten der 
jeweiligen Funktionen, als auch der Quellcode der Funktion selbst.
Daneben enthält die gleich benannte .h lediglich die "Funktionsköpfe", 
so dass das Hauptptrogramm die einzelnen Funktionen un dderen 
Schnittstellenaufbau beim Compilieren kennt.
Somit kann ich hierzu ja einfach die .c kopieren und den Quellcode der 
Funktion bis auf den Funktionskopf rauslöschen.

Nun endlich zu meinen Fragen:
- ist das bis hierher grundsätzlich noch richtig gedacht?
- wie binde ich die .h, .c ein?
(Ich habe in einer englischen Hilfe zum CooCox gelesen, die .h über 
include, die .c über CooCox selbst einbinden, aber wie?)

- Variablen, die ich in der .h global definiere, können diese dann auch 
in der main genutzt werden?

Kann mir das jemand mal Schritt für Schritt kurz und bündig erläutern?

Bin für jede ernst gemeinte Antwort wirklich überaus dankbar.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Hi,

Dein Ansatz ist richtig. In der main.c soll sowenig Code wie möglich 
enthalten sein. Daher erstelle eine functions.h für alle Definitionen, 
eine functions.c für alle Funktionen und eine main.c

Die Grundstruktur ist folgende:

Beispiel funktions.h:
1
#include <xxx.h>
2
3
/*weitere Include-Dateien, je nach Funktion (SPI, USART, GPIO, RCC)*/
4
5
#ifdef FUNCTIONS
6
 
7
 /*alle Deine Variabeldekalrationen, Defines usw.*/
8
 #define ...
9
 uint32_t ...;
10
 
11
#else
12
extern void DeinFunktionsname_1();
13
/*alle Deine Funktionsnamen hier rein*/
14
15
#endif

Beispiel funktion.c
1
#include <functions.h>
2
3
/*weitere Include-Dateien, je nach Funktion (SPI, USART, GPIO, RCC)*/
4
5
#define FUNCTIONS
6
void Funktionsname_1(void)
7
{
8
9
}
10
void Funktionsname_2(void)
11
{
12
13
}
14
15
/*Alle Deine Funktionen*/

Beispiel main.c
1
#include <funtions.h>
2
3
int main (void)
4
{
5
  /*Alle Funktionen aufrufen z.B. alle Initialisierungen*/
6
  
7
 while (1)
8
 {
9
 /*Deine Funktionen die in der Schleife laufen sollen*/
10
 }
11
}

Vergesse aber nicht die jeweiligen benötigten Bibliotheken zu 
inkludieren.

Die Struktur erstellt jeder nach seiner persönlichen Vorlieben (oder wie 
das jeweilige Unternehmen vorschreibt).

: Bearbeitet durch User
von soundmachine (Gast)


Lesenswert?

Hallo Daniel,

vielen Dank für deine Erklärungen.

Ein paar Fragen bleiben dennoch offen.

bei mir hätte das jetzt wiefolgt ausgesehen.

functions.h

int add(int sum1, int sim2);

int sub(int sum1, int sim2);


functions.c

int add(int sum1, int sim2)
{return sum1+sum2;}

int sub(int sum1, int sim2)
{return sum1-sum2;}


vorallem deine DEFINEs und IFDEFs verstehe ich leider noch nicht.


Daneben wäre meine Frage, wo die functions.c abgelegt werden soll. 
Reicht das, wenn die Datei einfach im gleichen Windows Ordner wie die 
main liegt oder muss hier in CooCox noch ein Pfad angegeben/ewas 
eingebunden werden

von Daniel A. (daniel-a)


Lesenswert?

@Daniel V. (voda)

Ich würde funktions.h eher so aufteilen:
1
/* Header guard */
2
#ifndef FUNCTIONS_H
3
#define FUNCTIONS_H
4
5
/* Include-Dateien, je nach Funktion (SPI, USART, GPIO, RCC)*/
6
#include <xxx.h>
7
8
/* Defines */
9
#define BLA 123
10
11
/* Typedefs, structs, unions und enums */
12
13
struct bla {
14
  int bla;
15
};
16
17
/* globale Variablen deklarationen */
18
extern int bla;
19
 
20
/*alle Deine Funktionsnamen hier rein*/
21
void DeinFunktionsname_1(void);
22
void DeinFunktionsname_2(void);
23
24
#endif

funktion.c:
1
#include <functions.h>
2
3
int bla;
4
5
void Funktionsname_1(void){}
6
void Funktionsname_2(void){}


soundmachine schrieb:
> bei mir hätte das jetzt wiefolgt ausgesehen.
...

Sieht in ordnung aus.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Wie sehen Deine C-Kenntnisse denn im allgemeinen aus?

Alle Befehle mit einer # sind Präprozessorbefehle (Direktive). Mit 
#ifdef wird untersucht ob das Symbol definiert ist. Wenn ja, (daher in 
der functions.c die Direktive #define FUNCTIONS) werden alle Defines und 
Deklarationen ausgeführt.

Wenn das Symbol nicht vorkommt (in der main.c) wird die Anweisungen 
hinter #else ausgeführt. #enfif beendet diesen Part.

Kauf Dir mal das Buch C-Programmieren von Anfang von Helmut Erlenkötter 
oder schau Dir das sehr gute Tutorial an. Es geht um die Programmierung 
von ARM-Controller von ST in CooCox. Er fängt dabei ziemlich weit von 
vorne an (Boolesche Algebra, Programmierung mit C, Aufbau eines µC usw.)

https://www.youtube.com/watch?v=5zpctyaskqA&list=PLd79x-uW4uyZUTnuAxnIBFj56JhK5io3g

Daniel A. schrieb:
> @Daniel V. (voda)

Ich wollte die Grundstruktur aufzeigen aber Du hast natürlich Recht. 
Jeder macht das nach seinen Vorlieben.

: Bearbeitet durch User
von fürn hugo (Gast)


Lesenswert?

Coocox compiliert alles was du zu deinen Projekt hinzugefügt hast, da 
brauchst du keinen zusätzlichen Pfad. Allerdings hat die CooCox 
Ordnerstruktur nichts mit der Ordnerstruktur auf deiner Festplatte zu 
tun.

von soundmachine (Gast)


Lesenswert?

Hallo Hugo...soweit hab ichs verstanden, aber wie genau füge ich eine .c 
und .h Datei in das Projekt hinzu. Einfach "irgendwo ablegen" und dann 
die Includes in die main schreiben? Damit wird's ja wohl nicht getan 
sein...

von Daniel V. (voda) Benutzerseite


Lesenswert?

soundmachine schrieb:
> Hallo Hugo...soweit hab ichs verstanden, aber wie genau füge ich
> eine .c
> und .h Datei in das Projekt hinzu. Einfach "irgendwo ablegen" und dann
> die Includes in die main schreiben? Damit wird's ja wohl nicht getan
> sein...

Leider kenn ich mich in CooCox nicht so gut aus, aber normalerweise 
musst Du die Dateien im Projekt hinzufügen. Dabei bin ich in Keil immer 
so vorgegangen. Das Beispiel ist für einen STMF4, ist aber im Prinzip 
auch auf andere Familien von STM anwendbar. Die erforderlichen Dateien 
sind aus der StdLib von ST entnommen.

.\cmsis_boot
 stm32f4xx.h
 stm32f4xx_conf.h
 usw.
.\startup
 core_cm4.h
 usw...
.\cm_CoreSupport
  startup_stm32f446xx.s
 usw..
.\StdLib_inc
 alle benötigten stm32f4_xxx.h
 (z.B xxx= GIPO, RCC, USART, DMA, SPI, I2C...)
 Im diesem Ordner kannst Du durch Hinzufügen im Projekt die  functions.h 
dazuholen.
.\StdLib_src
 hier liegt die main.c
 hier kannst Du durch Hinzufügen die functions.c dazuholen.

Vllt mich rechter Maustaste Add New File oder so...

Aber das Prinzip sollte jetzt klar sein. Das von mir verlinkte 
Tutorialreihe geht in einem Video auf die CooCox-IDE etwas genauer ein 
;)

Gruß
Daniel

: Bearbeitet durch User
von fürn hugo (Gast)


Lesenswert?

In Coocox: Im Navigation Window rechte Maus Taste auf den Ordner wo du 
es dazu fügen willst und auf Add File gehen und dann deine .c, .h 
auswählen.
Wie man in c eine .h verwendet wurde eh schon oben besprochen.

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.