Es handelt sich um ein Header file (counter.h). Wenn ich die Deklarationen in ein c-File einbaue, läuft es normal - Das ist ja aber nicht der Sinn der Sache, wenn man mit header Files arbeiten will.
Ich verwende folgendes:
IDE: Code::Blocks
Toolchain: C:\WinAVR-20100110
Die Ursache für den Fehler liegt nicht in diesem Headerfile, sondern mindestens eine Ebene darüber. Evtl. wird die Datei von einer Assemblerdatei (oder von einer Datei, die der Compiler für eine solche hält) inkludiert, oder es gibt irgendwo ein offenes asm().
Wie immer bei solchen Problemen: Zeige ein minimales Beispiel, in dem der Fehler auftritt, einschließlich aller beteiligten Dateien und der verwendeten Compileroptionen.
||=== Build: Release in uart_test (compiler: GNU GCC Compiler for AVR) ===|
lib\counter.h|7|Error: unknown opcode `void'|
||=== Build finished: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Da steht Zeile 7, im Beispiel oben ist das Zeile 9. Ich musste die Formatierung bearbeiten, sonst wären hier im Forum 2 includes in einer Zeile angezeigt...
Die Ursache für den Fehler liegt nicht in diesem Headerfile, sondern
mindestens eine Ebene darüber. Evtl. wird die Datei von einer
Assemblerdatei (oder von einer Datei, die der Compiler für eine solche
hält) inkludiert, oder es gibt irgendwo ein offenes asm().
Wie immer bei solchen Problemen: Zeige ein minimales, aber dennoch
kompilierfähiges Beispiel, in dem der Fehler auftritt.
was genau war es denn? Präzisere Beschreibung von Problem und Lösung hilft den Fragenstellenden und denjenigen, welcher veventuell ein ähnliches oder das gleiche Problem hat.
was genau war es denn? Präzisere Beschreibung von Problem und Lösung
hilft den Fragenstellenden und denjenigen, welcher veventuell ein
ähnliches oder das gleiche Problem hat.
Es war ganz genau das Beschriebene. Ich hatte die Header in einer Assemblerdatei includiert. Das (bzw. die Deklaration im Header, der in der Asm angezogen wird) hat dem Compiler nicht geschmeckt.
Ich dachte ich muss includieren, aber das ist ja nicht nötig, wenn es als extern deklariert wird.
Das File sieht jetzt so aus:
#ifndef COUNTER_H
#define COUNTER_H
#include <avr/io.h>
#include <avr/interrupt.h>
extern volatile void inctimer(void);
extern volatile uint64_t timer_val;
#endif // COUNTER_H
Dazu gibt es ein Assemblerfile:
#include <avr/io.h>
#include <avr/interrupt.h>
temp = 16
.comm timer_val, 8
.global inctimer
inctimer:
1
SomeAssemblercode
2
3
ret
Ich habe mir das lss angesehen und alle calls etc. sehen gut aus.
Vielen Dank.
Ist halt schlecht, daß Du im Assemberfile keine Chance hast, zu verfizieren, daß die zugehörigen Definitionen in der Headerdatei auch wirklich passen.
Wenn Du aus irgendeinem Grund eine davon änderst, bekommst Du das nicht mit.
Wie immer bei solchen Problemen: Zeige ein minimales,
aber dennoch
kompilierfähiges Beispiel, in dem der Fehler auftritt.
Ja, der Hinweis ist grundsätzlich absolut gold wert, trotzdem:
Das kompilierfähige Minimalbeispiel, das einen Compiler-Fehler produziert, würde ich wirklich gern mal sehen. ;)
Danke, das war es!
Genau deshalb ist der Hinweis mit dem vollständigen Minimalbeispiel gleich doppelt wichtig. Nicht selten klären sich Problem nämlich schon beim Erstellen eines solchen, weil man dabei feststellt welche anderen Files (und Programmzeilen) dafür unbedingt nötig sind.
Die Zeile ist schon wichtig, daher verstehe ich nicht, warum die bei Fehlerfragen erstmal immer weggelassen wird.
Und natürlich das File als Anhang, damit die Nummer auch stimmt.
Man muß bedenken, daß in C der Zeilenvorschub kein Syntaxelement ist, d.h. der Fehler kann sich in Kombination mit Zeilen davor ergeben.
Man kann sogar ganze Programme in eine Zeile schreiben oder umgekehrt jeden Teilausdruck in eine neue Zeile:
Wie immer bei solchen Problemen: Zeige ein minimales,
aber dennoch
kompilierfähiges Beispiel, in dem der Fehler auftritt.
Ja, der Hinweis ist grundsätzlich absolut gold wert, trotzdem:
Das kompilierfähige Minimalbeispiel, das einen Compiler-Fehler
produziert, würde ich wirklich gern mal sehen. ;)
Asche auf mein Haupt.
Zu dem Zeitpunkt, als ich den Widerspruch entdeckt und korrigiert habe,
hatte Jörn seine Antwort zwar noch nicht abgeschickt, aber den alten
Text leider schon in seinem Editorfeld stehen. Das Internet vergisst
halt nie :)