1Danke
ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
1090
1090
EMPFEHLEN
-
Hi Ho Leute,
hab seit Längerem ein durchgehendes Problem in C, dass ich nicht gelöst bekomme.
Folgende Situation. Ich möchte eine eigene Struktur in einen Treiber einpflegen. Habe eine .h Datei und dort folgende Struktur eingetragen:
Code :1 2 3 4 5 6
struct beacon_additional{ u_int8_t *info; u_int8_t counter; int info_len; struct net_device * dev_add; }
nun habe ich eine globale Struct-Variable in einer .c Datei erstellt mit:
Hab dort Stück für Stück über Malloc Speicher reserviert etc. Alles lief einwandfrei.Code :1
struct beacon_additional *add_info;
Nun brauche ich die gleiche globale Struct-Variable in einer anderen .c Datei. Jetzt habe ich gelesen das geht über das Schlüsselwort "extern"
Habs ausprobiert mit:
Code :1
extern struct beacon_additional *add_info;
Kompiliert wird es problemlos. Auch der Treiber läuft, jedoch wenn ich in dieser 2. Datei auf den add_info Zeiger bspw. auf den Counter zugreifen will, um ihn zu inkrementieren. Dann wird es auch problemlos kompiliert, aber beim Laden des Modules kommt folgende Fehlermeldung in demsg:
Code :1
Unknown symbol add_info
oder das System hängt sich komplett auf. Wieso passiert sowas? Wie kann ich diese Fehlermeldung beheben?
Greetz
Euer HCWDThat's not a bug, that's a feature!
-
16.10.09 11:28 #2
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Die extern Deklaration muss in die Headerdatei, die Definition dann in eine .c Datei.
Du hast nicht genau gesagt wie das bei dir aussieht. Was für Dateien du erstellst (DLLs?) usw.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hi Ho,
also ich nutze halt den MadWIFI Treiber.
Kannst du sagen in wiefern du die Genauigkeit meinst? Also ich habe halt 2 .c Dateien und eine .h Datei, inder die Struct Deklaration drin steht.
Habe die Header auch in beide .c Dateien includiert, wenn es dir darum geht.
Könntest du etwas mir auf die Sprünge helfen, was man hier noch posten kann, um dir die Hilfe zu erleichtern.
Vor allem überleg ich mir grad, gilt dann auch die Deklaration des Struct-Pointers add_info als global? ich mein eigentlich von meinem Verständnis müsste es so sein, ich wollte nochmal es nur bestätigt bekommen
GreetzThat's not a bug, that's a feature!
-
16.10.09 13:18 #4
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also es lag an der Deklarierung statt in der .c-Datei in die .h Datei. Dort habe ich nun das extern reingeschrieben. Läuft alles perfekt... Vielen Dank
That's not a bug, that's a feature!
-
Also ich hab jetzt immer noch ein Problem. Diesmal aber ein anderes. Ich habe jetzt entsprechend die extern Deklarierung zum Laufen gebracht. Aber wenn ich jetzt auf ein Feld der externen Struktur zugreife (sei es add_info->counter // u_int8_t), hängt sich mein System auf.
Ich sollte noch hinzufügen, dass es sich hier um eine Struktur im Treiber handelt, die in einem Interrupt aufgerufen wird.
Weiß da jemand Rat?
//EDIT: Also mit der Lösung die Struktur-Variable im .h bereits extern zu definieren, klappt nicht, da in der 2. .c-Datei die Variable nicht die von der 1. .c-Datei ist, da über if(add_info != NULL) die if-Anweisung nicht ausgeführt wird. Irgendwie klappt das nicht so ganz....
Geändert von HCWD (22.10.09 um 13:18 Uhr)
That's not a bug, that's a feature!
-
24.10.09 19:59 #7
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Ist es denn zuviel verlangt den entsprechenden Code hier mal zu posten?
Wenn man es richtig macht, dann funktioniert es auch.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ich habe 2 Möglichkeiten bereits ausprobiert. Bei der 1. kompiliert er alles einwandfrei, nur da ist mir aufgefallen, das aus der Datei 2.c der Zeiger ein anderer sein muss, als aus der Datei 1.c, da ich ihn mit if(add_info == NULL) überprüfe und er dann in die If reinspringt:
Die hier ist aus der Datei 2.c:
Code :1
struct beacon_additional *add_info;
Dies ist aus der Datei def.h
Code :1 2 3 4 5 6
struct beacon_additional{ u_int8_t *info; u_int8_t counter; int info_len; struct net_device * device_additional; }; extern struct beacon_additional *add_info;
Dies ist aus der Datei 1.c:
Code :1 2 3
struct beacon_additional *add_info = NULL; [... //Weiter unten in einer Funktion] add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);
Hier die 2. Möglichkeit, die ich ausprobiert hatte. Hier meint er beim Laden des Moduls im dmesg: Unknown Symbol add_info
Die hier ist aus der Datei 2.c:
Code :1
extern struct beacon_additional *add_info;
Dies ist aus der Datei def.h
Code :1 2 3 4 5
struct beacon_additional{ u_int8_t *info; u_int8_t counter; int info_len; struct net_device * device_additional; };
Dies ist aus der Datei 1.c:
Code :1 2 3
struct beacon_additional *add_info = NULL; [... //Weiter unten in einer Funktion] add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);
Hoffe, das ist so ok?That's not a bug, that's a feature!
-
27.10.09 15:46 #9
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Wie bereits gesagt, muss die extern Deklaration in die Headerdatei und die Definition in eine C-Datei. Die Headerdatei mußt du natürlich in beide C-Dateien einbinden. Deine 2. Variante sollte auch funktionieren, ist allerdings weniger schön.
Welche Symbole sind sind in dem Modul enthalten?
Code :1
nm *.ko
Bist du sicher das du auch das aktuelle Modul verwendest und auch die Dateien neu erstellt wurden?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also ich habe jetzt durch den befehl, den du mir gepostet hast folgenden Ausschnitt gefunden:
[...]
00003f60 t _take_txbuf_locked
U add_info
U alloc_etherdev_mq
[...]
Das heißt doch, add_info sollte doch exisiteren oder? Kenne den Befehl nicht, deswegen kann ich das Ergebnis auch nicht interpretieren.
Aber ich habe nun folgendes umgeändert so wie du es genannt hast:
def.h:
Code :1 2 3 4 5 6
struct beacon_additional{ u_int8_t *info; u_int8_t counter; int info_len; struct net_device * device_additional; }; extern struct beacon_additional * add_info;
1.c:
Code :1
if(add_info != NULL) [...]
2.c:
Code :1 2 3
struct beacon_additional *add_info = NULL; [...] add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);
Habe natürlich die def.h in beide c-Dateien includet. Jedoch erscheint der gleiche Fehler. Trotzdem kommt immer noch der gleiche Fehler mit dem unknown Symbol add_info
Vielleicht sollte ich noch zusätzlich sagen, dass def.h und 1.c in einem Ordner stecken und 2.c in einem anderen Ordner sich befindet.
Bzgl. dem korrekten Modul: Ich denke, es ist das richtige Modul, das geladen wird, da wenn ich eine Kleinigkeit ändere, die vielleicht nen Syntaxfehler raus haut, bekomme ich ihn auch angezeigt beim Kompilieren. Auch fehlerfreie Änderungen werden richtig umgesetzt. Denke daran könnte es nicht liegen. Oder? o.OGeändert von HCWD (27.10.09 um 16:03 Uhr)
That's not a bug, that's a feature!
-
27.10.09 16:31 #11
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
der Treiber hat ein fertiges Makefile der die ganzen Dateien eigentlich korrekt kompilieren sollte.
Ich lege die Variablen alle global an. Also außerhalb jeglicher Funktionen lege ich die Variablen an. Sollte folglich global sein, oder?
Ich hab jetzt noch weiter mich da informiert und bin auf folgenden Gedanken gestoßen. Der Treiber an sich besteht aus mehreren Modulen. Und wie es wohl aussieht, versuche ich über das extern modulübergreifend den Zeiger zu benutzen. Kann es daran scheitern? Weil ich hab einfach mal die extern Schlüsselwörter getauscht von der Datei 1.c und 2.c hat er mir zwar die gleiche Fehlermeldung angezeigt bei dmesg, jedoch diesmal von einem anderen Modul.That's not a bug, that's a feature!
-
29.10.09 11:31 #13
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Und warum funktioniert es dann nicht?
Dieses kleine Detail hast du wohl vergessen zu erwähnen, was?
Deshalb hab ich ja auch gefragt wie es kompliert wird, welche Dateien wie miteinander zusammenhängen. Außerdem hast du von einem Modul gesprochen. Sorry, aber wenn die Leute nicht mal ihr Problem richtig beschreiben können und alles aus der Nase gezogen haben wollen dann *** mich das an.
Du mußt das Symbol exportieren EXPORT_SYMBOL.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja ich sprach vom Treiber Modul... da ich mich noch nicht lang damit befasse, wusste ich halt nicht, dass das Teil in mehrere Module geteilt ist. Sei es auch deswegen, weil ich eigentlich Windoof User bin... Aber egal.
Trotzdem danke für deine Hilfe, soweit ich was lernen konnte und Aufregung bringt auch nichts.
Deswegen habe ich doch eben hingeschrieben, dass nach längerem Informieren ich auf diesen Punkt gestoßen bin, also heißt das auch, nicht das ich es vergessen habe, sondern ich es schlicht und einfach nicht wusste. -.-That's not a bug, that's a feature!
Ähnliche Themen
-
Von extern mehrere Bilder(jpg) in Flash laden
Von helene1 im Forum Flash PlattformAntworten: 12Letzter Beitrag: 28.05.07, 23:05 -
Daten von extern auslesen
Von oernilein im Forum PHPAntworten: 8Letzter Beitrag: 19.09.06, 08:55 -
CSS Daten extern abspeichern
Von Steusi im Forum CSSAntworten: 4Letzter Beitrag: 14.09.06, 13:17 -
Daten über Variabeln extern laden
Von bastan2k im Forum Flash PlattformAntworten: 11Letzter Beitrag: 15.07.05, 16:31 -
Daten über mehrere Einträge beibehalten
Von Torgath im Forum PHPAntworten: 9Letzter Beitrag: 06.03.05, 10:08





Zitieren

Login





