C-Files aufsplitten

Persönliche Seite #1429326
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.
Persönliche Seite #1429352
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren