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.
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)*/
/*weitere Include-Dateien, je nach Funktion (SPI, USART, GPIO, RCC)*/
4
5
#define FUNCTIONS
6
voidFunktionsname_1(void)
7
{
8
9
}
10
voidFunktionsname_2(void)
11
{
12
13
}
14
15
/*Alle Deine Funktionen*/
Beispiel main.c
1
#include <funtions.h>
2
3
intmain(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).
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
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-uW4uyZUTnuAxnIBFj56JhK5io3gDaniel A. schrieb:> @Daniel V. (voda)
Ich wollte die Grundstruktur aufzeigen aber Du hast natürlich Recht.
Jeder macht das nach seinen Vorlieben.
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.
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...
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
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.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang