Hallo zusammen
ich versuche gerade den Arduino zu programieren. Leider klappt das mit
header Dateien irgendwie nicht recht. Ich habe folgenden Quellcode:
1
#ifndef COUNTER_H
2
3
#define COUNTER_H
4
5
#include<avr/io.h>
6
7
#include<avr/interrupt.h>
8
9
voidinctimer(void);
10
11
#endif // COUNTER_H
Toolchain gibt mir folgenden Fehler aus:
Error: unknown opcode 'void'
Kann jemand damit etwas anfangen?
Ich verwende Code::Blocks als IDE.
Und ja, mir ist die Arduino IDE bekannt
Und ja, ich benutze absichtlich Code::Blocks
Und nein, ich bin nicht an Grundsatzdiskussionen interessiert.
Dennoch danke ich allen für konstruktive Hinweise.
Gerade ein Miniprogramm auf gcc und g++ compiliert.
void inctimer(void);
int main()
{
return 0;
}
Ging problemlos durch.
Dein Problem muss irgendwo anders liegen. Aber nicht am void in deinem
Beispiel.
Vielleicht wäre eine ausführliche Fehlermeldung praktisch. Meist wird
noch eine Zeilennummer angegeben.
Was passiert ohne die #Includes?
Jörn R. schrieb:> Toolchain gibt mir folgenden Fehler aus:> Error: unknown opcode 'void'
Wer genau ist denn Toolchain? Klingt ja nach einem Assembler ...
LG, Sebastian
Jörn R. schrieb:> Dennoch danke ich allen für konstruktive Hinweise.
Die Hinweise zur Formatierung von Code mit den entsprechenden Code-Tags
hast du gelesen?
Das erleichtert dank der Zeilennummern den Bezug auf einzelne
Programmzeilen.
Jörn R. schrieb:> Und nein, ich bin nicht an Grundsatzdiskussionen interessiert.
Trotzdem: lies, was über jedem Texteingabefeld steht und beachte es.
Besonders die Sache mit der Codeformatierung...
Danke für die schnelle Reaktion.
Ohne die includes gibt es den selben Fehler.
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
Jörn R. schrieb:> Ich verwende folgendes:> IDE: Code::Blocks> Toolchain: C:\WinAVR-20100110
Nein, ich meine welches Tool der Toolchain gibt diese Fehlermeldung aus?
Und wie lautet die Aufrufzeile dieses Tools?
LG, Sebastian
Jörn R. schrieb:> Es handelt sich um ein Header file (counter.h).
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.
Der Fehler wird vom Compiler ausgegeben
||=== 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...
Es geht aber um die Zeile:
void inctimer(void);
Jörn R. schrieb:> Ich musste die Formatierung bearbeiten
Nicht nötig, du musst nur wie über jeder Texteingabebox beschrieben die
c-Tags verwenden.
Wenn ich deinen Code in eine C-Datei packe, dann kompiliert diese eine
Datei bei mir tadellos.
Wenn ich da was falsch mache, dann musst du genauer beschreiben, was du
sonst noch tust und hast und welche Dateien sonst noch beteiligt sind.
Yalu X. schrieb:> Jörn R. schrieb:>> Es handelt sich um ein Header file (counter.h).>> 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.
Danke, das war es!
Jörn R. schrieb:> Danke, das war es!
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.
Wegstaben V. schrieb:> Jörn R. schrieb:>> Danke, das war es!>> 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:
SomeAssemblercode
ret
Ich habe mir das lss angesehen und alle calls etc. sehen gut aus.
Vielen Dank.
Jörn R. schrieb:> Dazu gibt es ein Assemblerfile:
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.
Jörn R. schrieb:> Yalu X. schrieb:>> 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.
Jörn R. schrieb:> Da steht Zeile 7
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:
Michi S. schrieb:> Jörn R. schrieb:>> Yalu X. schrieb:>>> 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 :)