Autor Thema: PIC installieren  (Gelesen 13359 mal)

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« am: 04. June 2005, 14:24 »
hey zusammen
Irgenwie hab ich ein problem das ich überhaupt nich begreife wieso...
//Port.h
#ifndef PORT_INCLUDE
#define PORT_INCLUDE

inline unsigned char inportb(unsigned int port) ;
inline void outportb(unsigned int port,unsigned char value) ;
inline void outportw(unsigned int port,unsigned int value) ;

#endif


//Port.cpp
#include "port.h"

inline unsigned char inportb(unsigned int port)     /* Input a byte from a port */
{
   unsigned char ret;

   asm volatile ("inb %%dx,%%al":"=a" (ret):"d" (port));
   return ret;
}

inline void outportb(unsigned int port,unsigned char value) /* Output a byte to a port  */
{
   asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value));
}

inline void outportw(unsigned int port,unsigned int value)  /* Output a word to a port  */
{
   asm volatile ("outw %%ax,%%dx"::"d" (port), "a" (value));
}


//Pic.cpp
#include "port.h"
#include "pic.h"

void IntitPic(void)
{
   outportb(M_PIC, ICW1);       /* Start 8259 initialization    */
   outportb(S_PIC, ICW1);

   outportb(M_PIC+1, M_VEC);    /* Base interrupt vector        */
   outportb(S_PIC+1, S_VEC);

   outportb(M_PIC+1, 1<<2);     /* Bitmask for cascade on IRQ 2 */
   outportb(S_PIC+1, 2);        /* Cascade on IRQ 2             */

   outportb(M_PIC+1, ICW4);     /* Finish 8259 initialization   */
   outportb(S_PIC+1, ICW4);

   outportb(M_IMR, 0xff);       /* Mask all interrupts          */
   outportb(S_IMR, 0xff);
}


//Pic.h
#ifndef PIC_H
#define PIC_H

void IntitPic(void);

#define M_PIC  0x20     /* I/O for master PIC              */
#define M_IMR  0x21     /* I/O for master IMR              */
#define S_PIC  0xA0     /* I/O for slave PIC               */
#define S_IMR  0xA1     /* I/O for slace IMR               */

#define ICW1   0x11     /* Cascade, Edge triggered         */
                        /* ICW2 is vector                  */
                        /* ICW3 is slave bitmap or number  */
#define ICW4   0x01     /* 8088 mode                       */

#define M_VEC  0x68     /* Vector for master               */
#define S_VEC  0x70     /* Vector for slave                */

#endif


Das kompeliere ich alles schön mit gpp und krieg beim Pic.cpp den warning: port.h:5: warning: inline function 'void outportb(unsigned int, unsigned char)' used but never defined.

danach beim zusammen linken geht garnichts mehr :'(

Pic.o(.text+0x8):Pic.cpp: undefined reference to '__Z8outportbjh'
...

Höchst wahrscheinlich liegts an meinen C++ kenntnisse ;)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 04. June 2005, 15:00 »
du musst inlines in den headers definieren^^
prototypen für inlines sind blödsinn
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. June 2005, 15:39 »
dann stimmts also... mein c++ kenntnis ;) aber ich habe KA was du da sagst

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. June 2005, 15:50 »
inline unsigned char inportb(unsigned int port)     /* Input a byte from a port */
{
   unsigned char ret;

   asm volatile ("inb %%dx,%%al":"=a" (ret):"d" (port));
   return ret;
}

inline void outportb(unsigned int port,unsigned char value) /* Output a byte to a port  */
{
   asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value));
}

inline void outportw(unsigned int port,unsigned int value)  /* Output a word to a port  */
{
   asm volatile ("outw %%ax,%%dx"::"d" (port), "a" (value));
}


Das muss in die port.h, dann funktioniert es.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 04. June 2005, 16:18 »
hö ich muss das wo in der cpp datei in den Header nehmen? Braucht es dann überhaupt noch die cpp Datei?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. June 2005, 16:33 »
Nein, du brauchst dann keine port.cpp mehr, die inline Funktionen sind ja dazu gedacht, das der Code direkt in die aufrufende Funktion eingefügt wird, ähnlich wie bei Macros.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 04. June 2005, 16:40 »
aha und dann einfach mit dem gpp kompilieren wie es eine cpp datei wäre?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 04. June 2005, 16:42 »
Nein, einfach in die *.cpp-Datei includen, bei der du die Funktionen brauchst.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. June 2005, 15:04 »
Ok sehr schön das geht jetzt ;) Ich kann auch die ganze sache compilieren nur spuckt der mit beim Linken nen Fehler.
Pic.o(data+0x0):Pic.cpp multiple definition of "_irq_mask"
Kernel.o(.data+0x0):kernel.cpp: first defintion here


höchstwahrscheinlich liegts schon wieder an meiner unfähigkeit ^^ darum frage ich lieber mal was dieser Fehler bedeutet und auf was das hinweist (hat ja keinen sinn wenn ich jedesmal den code hier rein poste und eure zeit damit versaue).

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 05. June 2005, 15:36 »
Wahrscheinlich, dass du die Header-Datei, wo diese Funktion drinnen ist 2mal includest ohne folgendes Konstrukt zuhaben.

#ifndef HEADERNAME_H
#define HEADERNAME_H

< Inhalt der Header-Datei>

#endif

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #10 am: 05. June 2005, 16:00 »
Jaja der Preprozessor ist ein mächtiges Werkzeug, das man nicht unterschätzen sollte,
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 05. June 2005, 17:15 »
und bei einem "undefined reference to" deutet das auf was für einen Fehler hin? Krieg schon wieder so ne Fehler, nur is diesmal kein inline drin ;)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 05. June 2005, 20:08 »
Das die Funktion nicht in dem Modul zu finden ist...meisten ein vergessenes #include oder so.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 05. June 2005, 21:09 »
erst beim linken?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 06. June 2005, 13:55 »
Ja, beim Linken.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 06. June 2005, 20:19 »
irgendwie is das voll daneben ^^

Hab mal die ganze methode ausgeklammert, der Fehler bleibt aber! Die Methode wird nicht gebraucht aber er is da... an was könnte es sonst noch liegen?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #16 am: 06. June 2005, 20:33 »
scheibfehler verursachen sowas auch gern:P
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 06. June 2005, 20:38 »
Diese Fehler passieren doch schon beim Compilieren? Und es ist doch ned möglich das er nen Fehler war nimt wo ich ihm garnicht zum futtern gebe ^^

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #18 am: 06. June 2005, 20:40 »
naja wenn du eine funktion falsch schreibst merkt er erst beim linken, dass er die nicht findet^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 06. June 2005, 20:43 »
Sprich: Der Fehler kann überall sein? Ich liebe es... aber es is mir immer noch unbegreiflich das er mir beim Linken ne methode anzeigt die es für ihn ganricht geben kann, da ich es ausgeklammert habe ...

 

Einloggen