Forum: Mikrocontroller und Digitale Elektronik C-Files aufsplitten


von bool (Gast)


Lesenswert?

hallo

ich habe eine relativ grosses C-File und möchte es in zwei separate 
C-Files (Main.c und Uart.c) aufsplitten. Wird die Deklarierung (#ifndef 
uart_h
#define uart_h
#endif
 -->"uart.h")
 genauso wie bei Header Files gemacht oder muss man was beachten?

Gruss

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nein.
Aber du bist nicht der Erste, der sowas will.
Schau doch einfach mal, wie andere das machen...  :-/

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

uart.h:
1
#ifndef __UART_H__
2
#define __UART_H__
3
4
#define BAUDRATE      115200
5
#define RXEN          2
6
#define TXEN          3
7
8
int Uart_Init(int baudRate);
9
int Uart_GetChar(void);
10
int Uart_PutChar(int c);
11
12
...
13
14
#endif


uart.c:
1
int Uart_Init(int baudRate)
2
{
3
4
  return(success);
5
}
6
7
int Uart_GetChar(void)
8
{
9
  return(c);
10
}
11
12
int Uart_PutChar(int c)
13
{
14
  return(c);
15
}

main.h:
1
#ifndef __MAIN_H__
2
#define __MAIN_H__
3
4
#define CLK    72000000
5
...
6
7
#endif

main.c:
1
#include <stdio.h>
2
#include "main.h"
3
#include "uart.h"
4
5
6
void main()
7
{
8
  Uart_Init();
9
10
  while(1)
11
  {
12
    ;
13
  }
14
15
}

Hi,

hier haste ein (hoffe ich) sauberes Konstrukt für den Aufbau 
verschiedener Files.
Ich bevorzuge ein Pärchen aus .c/.h File pro Peripheral (also Treiber) 
bzw. Funktionsgruppe.
So wird dein Programm wunderbar modular, und du kannst alle Module aus 
.c/.h wiederverwenden.

Ausnahme sind z.B. eine GPIO.h, wo die Pin #defines gemacht werden, die 
dann in der uart.h mit #include-iert werden.


Also, copy&paste, und gleich beim sauberen Stil bleiben!


VG,
/th.

von einer (Gast)


Lesenswert?

kannst du mir noch erklären was
#ifndef _UART_H_
#define _UART_H_

genau bedeutet und für was es gebraucht wird?

danke!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

das ist ganz einfach:

Der C Präprozessor nimmt alles, was als
1
#include "fileName"
angegeben ist, und packt es in genau der Reihenfolge in seinem 
temporären "file" über das C file, was er gerade bearbeitet, und macht 
danach die Ersetzungen

Also z.b.
1
#define UART_BAUDRATE     115200
2
3
Uart_Init(UART_BAUDRATE);

wird
1
Uart_Init(115200);

Damit man das ganze steuern kann, gibt es so was wie anfragen:
1
#if
2
#else
3
#elsif
4
#endif
5
#ifndef
6
#ifdef
7
...

Wenn du ein Symbol abfragst, definierst, was definitiv noch nicht da 
ist, und es dann definierst, ist es in diesem kontext vorhanden.
Die präpro wird TRUE, und er macht alles, was zwischen #ifndef und 
#endif steht.
1
#ifndef __UART_H__
2
#define __UART_H__
3
4
#endif

Solltest du durch ein anderes Headerfile, was im gleichen kontext 
compiliert wird, das gleiche noch mal includen, wären Symbole doppelt.
Das wird hier verhindert, da beim zweiten Lauf das Symbol (
1
__UART_H__
) definiert ist.

Daher habe ich mir für die Headerfile-#ifndef (if not defined) die 
Nomenklatur
1
__FILENAME_H__
ausgedacht, da das eigentlich immer unique ist.


VG,
/th.

von einer (Gast)


Lesenswert?

ok, vielen dank für deine ausführungen!

von JJJ (Gast)


Lesenswert?

Immer wieder brauchbar: http://www.wachtler.de/ck/

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.