AVR-GCC: error: unknown opcode 'void'

OP #7573121
Lesenswert?

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
void inctimer(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.

#7573130
Lesenswert?

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?

OP #7573140
Lesenswert?

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

Moderator #7573146
Lesenswert?

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.

OP #7573148
Lesenswert?

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);

Moderator (Firma: Titel) Persönliche Seite #7573149
Lesenswert?

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.

Angehängte Dateien:
OP #7573155
Lesenswert?

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!

OP #7573171
Lesenswert?

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:

1
SomeAssemblercode
2

3
ret

Ich habe mir das lss angesehen und alle calls etc. sehen gut aus. Vielen Dank.

#7573873
Lesenswert?

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.

#7573980
Lesenswert?

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:

1
i
2
+=
3
1
4
;
Moderator #7574011
Lesenswert?

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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren