Linker-Fehler?
-
Ich grüße Euch,
ich muss ein µC-Projekt aus 8 *.c-Dateien und noch unendlich viel mehr Headern modifizieren. Ich arbeite mit Keil µVision2 (Ver 2.40).
Wenn ich das Projekt erzeugen will, bekomme ich folgende Warnungen:*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?CO?DP_USER
*** WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_VPC3_CALCULATE_INP_OUTP_LEN?DP_IF
CALLER1: ?PR?VPC3_ISR?DP_ISR
CALLER2: ?C_C51STARTUPDa vor den Nummern immer ein L steht, nehme ich an es handelt sich um einen Linker-Fehler!?
L16 bedeutet, dass ein Segment (wohl meist eine Funktion) nie aufgerufen wird und daher überflüssig ist!?
Am Ende der L16-Warnung steht die Datei, in der sich das überflüssige Segment befindet (war jedenfalls bisher so), in diesem Fall "DP_USER", richtig?
Solche Funktionen habe ich bisher einfach mal auskommentiert.
Ich weiß jetzt aber nicht welches Segment zu obiger L16-Warnung führt... Es ist vor dem Dateiname kein Funktionsname angegeben, wie sonst?!? Und mit dem "?CO" kann ich auch nix anfangen. Kann mir da mal jemand auf die Sprünge helfen?Mit der L15-Warnung kann ich nur soweit was anfangen, als das ich mir denke das das betroffene Element wieder hinter "SEGMENT:" angegeben ist (wie bei der L16-Warnung). Dieses wird anscheinend unzulässiger Weise mehrfach aufgerufen, richtig? Weiter weiß ich allerdings nicht...
Könnt Ihr damit was anfangen und mir Hilfestellung geben?
MfG
/Edit: Mir ist gerade noch etwas aufgefallen. L15-Warnungen gibt es insgesamt 6 Stück beim Erzeugen des Projektes. In allen Warnungen sind "CALLER1" und "CALLER2" gleich (siehe obiges Beispiel). Nur die betroffenen Elemente unterscheiden sich. Vielleicht hilft diese Info ja noch weiter!?
-
?CO heisst idR konstantes element. Hast du variablen in DP_USER.c als "code" deklariert? Wenn ja, dann ist es eine davon. Welche weiss der Linker nicht mehr, deshalb gibt es leider keine genaueren infos.
normalerweise müsste man diese meldung ignorieren können. wenn nicht, dann musst du lediglich die variable irgendwo im C code ansprechen. einfach eine dummy zuweisung oder ähnliches machen.
das multiple call bedeutet, dass die funktion sowohl von C aus als auch von einem interrupt her aufgerufen wird (oder es scheint dem linker so). problem dabei ist: die funktion muss reentrant faehig sein, sonst macht es bumm. denn interrupts koennen jederzeigt gefeuert werden und wenn du pech hast stehst du dann sowohl vom C code als auch vom interrupt her in der funktion drinnen. das kann dir daten überschreiben.
wenn du garantieren kannst, dass das nicht passiert: warnung ignorieren.
ansonsten entweder:-
als reentrant markieren - dann wird die funktion aber teurer, weil du dann einen reentrant stack und variablen hast. meistens will man diese lösung nicht.
-
interrupts beim eintritt in die funktion verbieten. wie das geht, steht sicher in der compiler doku
-
die dirty variante die meistens die beste ist:
2 mal die selbe funktion definieren. einmal für C code calls und einmal für interrupts.
-
-
Vielen Dank für die gute Hilfe,
das liest sich Alles sehr schlüssig. Leider stehe ich momentan vor einem anderen Problem und komme erstmal nicht dazu das Projekt weiter zu verbessern / zu bearbeiten... Mein Programmieradapter für den µC hat sich gestern schon wieder verabschiedet (scheinbar). Jedenfalls kann ich im Moment keinen Code auf den µC laden. Das Meiste was ich ins Projekt implementiere muss jedoch "live" getestet werden. Daher ist jetzt erstmal die Hardware dran!
Ansonsten werde ich mich bei der Multiple-Call-Sache wohl für Variante 2 oder 3 entscheiden. Für 3 müsste ich mir allerdings erstmal anschauen, wie groß die Funktionen sind und wieviel Speicherplatz ich noch habe.
2 macht erstmal den Besten Eindruck.Danke nochmal
Kolumbus