Forum: Mikrocontroller und Digitale Elektronik AVR-GCC: error: unknown opcode 'void'


von Jörn R. (jrn_r)


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.

: Bearbeitet durch Moderator
von Peter (pittyj)


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?

von Sebastian W. (wangnick)


Lesenswert?

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

von Rainer W. (rawi)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Jörn R. (jrn_r)


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

von Sebastian W. (wangnick)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


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.

: Bearbeitet durch Moderator
von Jörn R. (jrn_r)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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.

: Bearbeitet durch Moderator
von Jörn R. (jrn_r)


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!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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.

von Jörn R. (jrn_r)


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:

    SomeAssemblercode

    ret


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

von Gerhard Z. (germel)


Lesenswert?

Was die c-Tags angeht bist du wirklich beratungsresistent ;-(

von Harald K. (kirnbichler)


Lesenswert?

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.

von Michi S. (mista_s)


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.

von Peter D. (peda)


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
;

von Yalu X. (yalu) (Moderator)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.