mikrocontroller.net

Forum: Compiler & IDEs Header-File automatisch generieren


Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe oft wiederverwendbare Programmmodule und verwende 
selbstverständlich Header-Files für die Definitionen dafür.

Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben.

Kennt jemand ein Tool das aus dem .c-File mir die 
Funktions-Deklarationen automatisch auslesen und das .h-File erstellen 
kann?

Gruß

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben.

So?

Hmm, in einem ordentlichen Softwaredesign wäre das Headerfile
eigentlich zuerst da, da es das Interface eines Moduls nach außen
beschreibt.  Erst wenn das feststeht, sollte man mit der
Implementierung beginnen.  Alle Hilfsfunktionen, die ,,auf dem Weg''
entstehen, werden dann von vornherein gleich "static" deklariert,
damit sind sie nur modulintern sichtbar und müssen folglich auch nicht
ins Headerfile.

Ansonsten ist die von dir gewünschte Aufgabe so einfach nicht, da man
(zumindest wenn man es komplett formatfrei erledigen können möchte) ja
praktisch einen Teil des C-Parsers dafür implementieren muss.

GCC hat ein Feature, mit dem er beim Compilieren alle
Funktionsprototypen in eine separate Datei ablegen kann, die man ihm
mit -aux-info <dateiname> angibt.  Das müsste dir dafür weiter helfen.

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mache das anders:

jede neu Funktion die  ich editire stelle ich allen anderen 
zuvorerstellten voran. Unnmittelbar nach Erstellen der 
Funktionsdefinition  kopiere ich diese, füge sie oberhalb einer 
Trennzeile als letzte ein und ändere sie in eine Funktionsdecleration 
um.

So erhalte ich ohne großen auf Aufwand eine Liste der im Programm 
definerten Funktionen und stelle sicher das alle Funktionen vor ihrem 
Erstenaufruf deklariert sind. Gelegentlich verwende ich selbige 
Declerationsliste wenn ich ein Modul für eine lib schreibe gleichzeitig 
zum erstellen des Haederfiles.

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B.so



[c]
/*---------------------------------------------------------------------- 
----------------------------

  Name         :  LCD8bit.lib

  Description  :  Libery file for 8Bit LCD driver.
                  für Atmel 128 µC's
  Author       :  Winfried Jaeckel (deviltronic)

  and  this    :  Daten und Steuerport_Bits können
                  relativ freigewählt, müssen dann aber in den
                  "General purpose constants" angepaßt werden.

------------------------------------------------------------------------ 
--------------------------*/

#ifndef LCD8bit
#define LCD8bit
#include <delay.h>

/*---------------------------------------------------------------------- 
----------------------------
                                  General purpose constants
------------------------------------------------------------------------ 
--------------------------*/
#ifndef NULL
#define NULL                       0
#endif

#define FALSE                      0
#define TRUE                       1

#define LCD_X_RES                  16
#define LCD_Y_RES                  2

// Datenport

#define LCD_Dataport               PORTA    // PortA
#define LCD_Dataport_RR            DDRA
// Steuerport
#define LCD_Steuerport             PORTC    // PORTC
#define LCD_Steuerport_RR          DDRC

#define LCD_ON_PIN                 0x01     //  PC0
#define LCD_RS_PIN                 0x02     //  PC1
#define LCD_RW_PIN                 0x04     //  PC2
#define LCD_E_PIN                  0x08     //  PC3
// LCDPWM PORT

#define LCD_PWM_PORT               PortB    // Portb
#define LCD_PWM_PORT_RR            PortB    // Portb



/*---------------------------------------------------------------------- 
----------------------------
                                 Public function prototypes
------------------------------------------------------------------------ 
--------------------------*/
/*
static void LCD_Delay               (void);
static void LCD_SDelay              (void);

void LCD_Open                   (void);
void LCD_Close                  (void);
void LCD_Strobe                 (void);
void LCD_Command                (void);
void LCD_Data                   (void);

void LCD_Clear                  (void);
void LCD_Home                   (void);
void LCD_Uhr_Home               (void);
void LCD_S_L_Home               (void);
void LCD_2_L_Home               (void);
void LCD_3_L_Home               (void);
void LCD_4_L_Home               (void);
void LCD_Mode                   (void);
void LCD_D_C_Control            (void);
void LCD_D_C_Shift              (void);
void LCD_Funktion_Set           (void);
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR);
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR);
void LCD_Read_BUSYFlag_ADC      (void); // inaktiv
void LCD_Write_Data_to_RAM      (unsigned char DB);
void LCD_ReadD_Data_from_RAM    (void);// inaktiv

void LCD_Init                   (void);
void LCD_Write_Str              (char []);
void LCD_Write_Strf             (flash char str [] );
void LCD_Write_Stre             (eeprom char str [] );
void LCD_Cursor_On              (void);
void LCD_Cursor_Off             (void);
void LCD_Cursor_Blink           (void);

Characters          01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
First line      (H) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
80-8F
Second line     (H) 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 
C0-FF
Third line      (H) 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 
90-9F
Fourth line     (H) 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 
D0-DF

 */

//-------------------------------------------------
static void LCD_Delay ( void )
{
    delay_ms(30);

}
//-------------------------------------------------
static void LCD_SDelay ( void )
{
    delay_ms(1);

}
//-------------------------------------------------
//------------------------------------------------------

void LCD_Open(void)

{
   //LCD_Steuerport = 0xFA;            //steuerbits high
   //LCD_Steuerport_RR = 0x0F;        //steurport ein
   //LCD_Dataport = 0x00;             // Port Löschen
   //LCD_Dataport_RR = 0xFF;          // Dataport zur Ausgabe freigeben

}


//------------------------------------------------------
void LCD_Close(void)

{
   //LCD_Dataport_RR = 0xFF;          // Dataport zur Ausgabe freigeben
   //LCD_Dataport = 0x00;             // Port Löschen
   //LCD_Steuerport = 0xFA;            //steuerbits high
   //LCD_Steuerport_RR = 0x0F;        //steurport ein

}

//----------------------------------------

   void LCD_on (void)
{
    LCD_Steuerport =0xFE // &= ~LCD_ON_PIN
    ;
    delay_ms(1000);
    LCD_Steuerport =0xFA; // &= ~LCD_RS

}
//----------------------------------------

   void LCD_off (void)
{

    LCD_Steuerport =0xFF //|= LCD_ON_PIN
    ;
    delay_ms(1000);

}

//----------------------------------------

void LCD_Strobe(void)
{
    LCD_Steuerport &= ~LCD_E_PIN;
    LCD_SDelay();
    LCD_Steuerport |= LCD_E_PIN;
    LCD_SDelay();
}
//----------------------------------------

void LCD_Command(void)
{
    LCD_Steuerport &= ~LCD_RS_PIN;
    LCD_SDelay();
}
//----------------------------------------

void LCD_Data(void)
{
    LCD_Steuerport |= LCD_RS_PIN;
    LCD_SDelay();
}


//-------------------------------------------------
void LCD_Clear ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x01;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------
void LCD_Home ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x02;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//-------------------------------------------------
void LCD_Mode ( void )
{

    LCD_Delay();
    LCD_Delay();

    LCD_Delay();
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x06;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
    LCD_Delay();
    LCD_Delay();
}
//-------------------------------------------------
void LCD_D_C_Control ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0C;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}

//-------------------------------------------------
void LCD_Cursor_On ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0E;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_Cursor_Off ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0C;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_Cursor_Blink ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0F;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_D_C_Shift ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x14;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------
void LCD_Funktion_Set ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x38;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//-------------------------------------------------

void LCD_Write_Data_to_RAM (unsigned char DB )
{
    LCD_Open();
    LCD_Data();

    LCD_Dataport = DB;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------

void LCD_Init (void)
{
LCD_Delay();
LCD_Funktion_Set();
LCD_D_C_Control();
LCD_Mode();
LCD_Clear();
LCD_Home();
}

//-------------------------------------------------
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR)
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = DDADDR;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_SDelay();
}
//-------------------------------------------------
void LCD_Uhr_Home               (void)
{
LCD_Set_DDRAM_ADDR(0x88);LCD_Delay();
}

//-------------------------------------------------
void LCD_S_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay();
}
//-------------------------------------------------
void LCD_2_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay();
}
//-------------------------------------------------
void LCD_3_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0x90);LCD_Delay();
}
//-------------------------------------------------

void LCD_4_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xD0);LCD_Delay();
}
//-------------------------------------------------
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR)
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = CDADDR;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_SDelay();
    }

//-------------------------------------------------
void LCD_Write_Str (char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}
//-------------------------------------------------
void LCD_Write_Strf (flash char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}
//-------------------------------------------------
void LCD_Write_Stre (eeprom char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}

//-------------------------------------------------
#endif  //  LCD8bit
/*---------------------------------------------------------------------- 
----------------------------*/

[\c]

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hoppla jetzt aber:
/* LCD 8Bit driver routines

*/

#ifndef _LCD8bit_INCLUDED_
#define _LCD8bit_INCLUDED_


#pragma used+
static void LCD_Delay               (void);
static void LCD_SDelay              (void);

void LCD_Open                   (void);   
void LCD_Close                  (void);
void LCD_on                     (void);
void LCD_off                    (void);

void LCD_Strobe                 (void);
void LCD_Command                (void);
void LCD_Data                   (void);

void LCD_Clear                  (void);
void LCD_Home                   (void);
void LCD_Uhr_Home               (void);
void LCD_S_L_Home               (void);
void LCD_2_L_Home               (void);
void LCD_3_L_Home               (void);
void LCD_4_L_Home               (void);

void LCD_Mode                   (void);
void LCD_D_C_Control            (void);
void LCD_D_C_Shift              (void);
void LCD_Funktion_Set           (void);
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR); 
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR);
//void LCD_Read_BUSYFlag_ADC      (void); // inaktiv
void LCD_Write_Data_to_RAM      (unsigned char DB); 
//void LCD_ReadD_Data_from_RAM    (void);// inaktiv

void LCD_Init                   (void);   
void LCD_Write_Str              (char []);
void LCD_Write_Strf             (flash char str [] );  
void LCD_Write_Stre             (eeprom char str [] );
void LCD_Cursor_On              (void);
void LCD_Cursor_Off             (void);
void LCD_Cursor_Blink           (void);


#pragma used-
#pragma library Lcd8bit.lib

#endif



Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry da ich nicht angemeldet sondern nur als Gast anwesend war kann 
ichs nicht korrigeren oder löschen. Die token sind mir missglückt aber 
worum es geht ist wohl leicht zu erkennen.
CTRL+c und CTRL+v sind deine Freunde bei der Routinearbeit sicher wäre 
ein Genrator auch eine Lösung. Am besten einer der beim erstellen einer 
*.lib gleich das zugeöhrige *.h generiert

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, sehr schön...
aber ich erinnere mich noch wage daran das nach automatischer Erstellung 
des Haeders gefragt wurde.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.
Der Tipp von Jörg tuts erstmal. Geb ihm auch vollkommen recht in seiner 
Aussage.
Die Idee von Winne ist aber auch nicht schlecht.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.