Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: matthieuriolo 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 ;)
-
du musst inlines in den headers definieren^^
prototypen für inlines sind blödsinn
-
dann stimmts also... mein c++ kenntnis ;) aber ich habe KA was du da sagst
-
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.
-
hö ich muss das wo in der cpp datei in den Header nehmen? Braucht es dann überhaupt noch die cpp Datei?
-
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.
-
aha und dann einfach mit dem gpp kompilieren wie es eine cpp datei wäre?
-
Nein, einfach in die *.cpp-Datei includen, bei der du die Funktionen brauchst.
-
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).
-
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
-
Jaja der Preprozessor ist ein mächtiges Werkzeug, das man nicht unterschätzen sollte,
-
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 ;)
-
Das die Funktion nicht in dem Modul zu finden ist...meisten ein vergessenes #include oder so.
-
erst beim linken?
-
Ja, beim Linken.
-
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?
-
scheibfehler verursachen sowas auch gern:P
-
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 ^^
-
naja wenn du eine funktion falsch schreibst merkt er erst beim linken, dass er die nicht findet^^
-
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 ...
-
Irgendwo muss es ja angegeben sein
-
Ich glaub ich habs ^^
asm ( ...
" call keyb_handler \n"
...
);
das is das einzige das auf diese Methode hinweist nur, wenn ich die Klammer mache () meckert er schon wieder ^^