Hallo,
ich benutze WinAvr 20071221 mit AVRStudio 4.13 Built 571.
Nun Habe ich bei mehreren Projekten schon den Effekt gehabt, dass ich
beim erstmaligem kompilieren Warnings bekam. Wenn ich dann einfach
nochmal kompiliert habe, waren die Warnings verschwunden und das
Built-Fenster sagte:
- Build succeeded with 0 Warnings... -
Wenn ich dann im Projekt etwas geändert habe, traten die Warnings
sporadisch wieder auf, waren aber beim 2. kompilieren wieder weg. Das
Programm funktioniert dann auch.
Mir ist aufgefallen, dass das immer bei Projectebn passiert, in denen
ich mindestens 2 .c dateien mit der jeweiligen .h datei habe.
Also so:
pwm.h und pwm.c und dazu dann die test.c in der #include pwm.h steht.
In der pwm.c steht somit keine int main(void)
jetzt weiß ich nicht, ob es beim kompilieren einen Unterschied macht,
welches Fenster gerade aktiv ist.
Jedenfalls ist mir dieses Phänomen schon bei mehreren Projecten
aufgefallen.
Über Tipps oder Hilfen wäre ich echt dankbar
Grüße
Sebastian
also normal wird aus jeder .c Datei ein Objekt erzeugt (compiliert)
Die Object-files werden zum schluss gelinkt woraus das eigentliche
Programm entsteht.
Wenn sich die .c Datei nicht geändert hat, wird das Objectfile nicht neu
erstellt und es erscheinen deshalb keine Warnings.
Gruß
Roland
>Über Tipps oder Hilfen wäre ich echt dankbar
Wir auch ;-)
Was kommen denn da für Fehlermeldungen/Warnings?
[Glaskugelmodus=on]
>...pwm.h und pwm.c und dazu dann die test.c in der #include pwm.h steht...
Sieh dir mal das Thema Deklaration und Definition an. Vielleicht hilft
das weiter.
[Glaskugelmodus=off]
Hallo,
danke schon mal für die Tipps bisher.
Dadurch habe ich herausgefunden, dass irgendetwas im Sourcecode nicht
stimmt.
Daher hänge ich ihn mal mit den Warnings an.
Ich wusste nicht, dass beim compilieren das Objectfile nicht immer neu
geschrieben wird. Kann man das irgendwo einschalten, so dass die
Warnings immer auftreten?
Mich wundert nur, dass das Programm läuft.
Also hier der Code (Bin aber noch in den Anfänge des Programmierens,
daher bitte nicht zuuuuu Kritisch sein ;-))
Hier die Warnings:
../test.c:38: warning: implicit declaration of function 'strcpy'
../test.c:38: warning: incompatible implicit declaration of built-in
function 'strcpy'
Es ist hier zwar nicht die beschriebene PWM-Routine, aber das ist das
aktuellste Projekt von mir bei dem die Warnings auftreten.
Leider bin ich mit meinen Kenntnissen noch nicht so weit, dass ich den
Fehler finde. Wahrscheinlich was ganz simples und ich sehe es einfach
nicht.
Wenn mich jemand drauf aufmerksam machen würde, wäre ich sehr dankbar.
Grüße
Sebastian
Ok, danke,
wenn ich die Syntax und die Beispiele zu strcpy mal Zeile für Zeile
angeschaut hätte, hätte ich drauf kommen müssen.
Muss mich entschuldigen, meine eigene Doofheit ;-)
Jetzt sind die beiden Warnings weg.
Aber dafür habe ich !3! neue, die ich wirklich nicht verstehe:
../uart.c: In function 'put2string':
../uart.c:83: warning: passing argument 1 of 'strcpy' discards
qualifiers from pointer target type
../uart.c:83: warning: passing argument 2 of 'strcpy' discards
qualifiers from pointer target type
../uart.c:102: warning: return from incompatible pointer type
Ich verstehe die nicht, weil ich doch in den Funktionen ausschließlich
mit char arbeite. Und in der letzten Funktion einen Zeiger auf char, bzw
die Speicheradresse des Strings zurückgebe!?
Oder bin ich wieder zu blind??? ....oder doch vielleicht doof??
Grüße
Sebastian
Hallo,
die Lösung hat Rufus schon geschrieben, hier noch ein Hinweis zum
Compilieren:
Das AVR-Studio erstellt für den Comiliervorgang eine Makefile. Make ist
so intelligent, dass es erkennt welche C-Datei geändert wurde und dass
diese dann auch neu Comiliert werden müssen. Wenn du jetzt zweimal auf
'Comilieren' klickst, werden beim ersten mal die Dateien Compiliert und
die Warnings erscheinen. Wenn du zum zweiten mal auf Compilieren
klickst, erkennt make dass es nix zu tun gibt. Es wird nix Compiliert
und es gibt somit auch keine Warnings. Schau dir mal dazu genau die
Build-Ausgabe im AVR-Studio an. Da kannst du das auch erkennen.
Du kannst das komplette (neue) erstellen aber auch erzwingen:
Es gibt im Menü den Punkt 'Make clean' oder 'Projekt bereinigen' (oder
ähnlich). Da werden dann alle object-Dateien gelöscht und beim nächsten
Compilieren sollten die Warnings alle wieder auftauchen.
Hoffe ich konnte dir helfen,
Grüße,
Florian
Die neuen Warnungen haben damit zu tun, daß die von Dir an strcpy
übergebenen char-Pointer volatile sind, strcpy selbst aber nicht so
deklariert ist, daß es volatile -Pointer erwartet.
Also wird der "Qualifier" volatile weggeworfen (to discard).
Wenn der Compiler einen ERROR meldet, ist er nicht in der Lage, ein
Object-File zu erstellen. Deshalb wird beim nächsten Versuch auch die
C-Datei nochmal kompiliert.
Bei einer WARNING kann der Compiler eine Object-Datei erstellen. Dadurch
wird er beim nächsten Mal die Object-Datei nicht noch einmal erstellen,
und die Warning verschwindet.
Beim GNU-Compiler gibt es die Option "-Werror" "threat all Warnings as
Errors". Vielleicht findest Du bei Deinem Compiler auch so eine Option?
Die Fehlermeldung mit dem volatile bekommst Du am einfachsten weg, indem
Du den Parameter auf den gewünschten Typ castest.
Ich sehe übrigens in Deinem Code KEINEN Grund, die Variablen volatile zu
deklarieren.
Volatile macht nur Sinn, wenn eine Variable gleichzeitig von mehreren
Tasks verwendet wird, und ein Task in einer Schleife auf Änderung pollt.
Diese Situation hast Du in Deiner Software gar nicht.