Hallo Freunde ,
schon vor einiger Zeit hatte ich mich hier wegen der AVR - Kapriolen
von Code::Blocks unter Linux hier etwas durchgefragt und es auch Gott
sei dank der Antworten von hier und vieler Internetrecherchen
geschafft, das ich mit Code::Blocks sozusagen das AVR-Studio ( Windows)
unter Linux damit ersetzen konnte.
Aber wie der Pechvogel nun so fliegt, kam ein HHD Fehler und damit auch
ein Neuaufsetzen des PC mit gleich dem aktuellem Linux auf mich zu.
Natürlich installierte ich auch wieder Code::Blocks, was für mich etwas
einfacher zu handeln ist bei der AVR Programmierung.
Nun habe ich heute, zum ersten Male, damit Hantieren wollen und wieder
ein "Fehlschuss" der nach hinten los ging. :(
Code::Blocks meckert beim Compilieren über die Funktionen
_delay_ms bzw. _delay_us.
Hier der Code:
1
// avr-test.c
2
// STK-500 mit ATmega32 MCU
3
// Zählt von 255 gegen NUlL usw..
4
// Die Ziffer wird binär auf dem STK500 mittels LEDs angezeigt
5
#include<avr/io.h>
6
#include<stdint.h>
7
#define F_CPU 3686400UL // Quarz mit 3.6864 Mhz STK500
8
//#define F_CPU 16000000UL
9
#include<util/delay.h> // in älteren avr-libc Versionen <avr/delay.h>
10
11
12
13
intmain(void)
14
{
15
DDRB=0xFF;// PB0 an PORTB als Ausgang setzen
16
PORTB=0xFF;
17
uint8_tvar=255;
18
while(1)// Endlosschleife
19
{
20
21
PORTB=var;// schreibe Variable in PORTB z. B. angeschlossene LEDs
22
23
_delay_ms(1000);// Eine Sekunde warten...
24
--var;
25
if(var<=0)
26
{
27
var=255;
28
}
29
}
30
return0;
31
}
Fehleranzeige : /usr/lib/avr/include/util/delay.h|163|error:
__builtin_avr_delay_cycles expects a compile time integer constant
Habe recherchiert und herausbekommen das ich nicht der Einzige bin der
vor diesen Rätsel steht, aber keine rechte Lösung gefunden .
Mit Geany kann ich den Code ohne Fehler compilieren ...
Geany und C::B benutzen doch wohl den selben AVR Compiler und selbe AVR
Libs... ???
Kann mir wer bitte einen Tip geben wo ich nach suchen muss/kann , um
dieses Makel zu beheben ??
Besten Dank für eventuelle Hilfe
Gruss
Gerhard
Optimierung ist an , verschieden schon probiert auch aus...alles
dasselbe Desaster... Will mir einfach nicht in den Kopf....
aber es ist nun mal so... ;)
Gruss und Dank
Gerhard
Gerhard H. schrieb:> Optimierung ist an
Welche genaue Kommandozeile wird denn beim Compilieren benutzt?
Die wird ja das Code::Blocks hoffentlich irgendwo zeigen.
Haben beide parallel hier geschrieben..konnte nicht mehr den Beitrag
ergänzen..compilieren geht jetzt, genaues morgen..
Irgendwo in den Einstellungen waren 2 versch. MCUs einmal Atmega32 und
andermal Atmega 128 zu finden ..woher ??????
Danke vielmals... Hab schon Kopfweh, muss aufhören.
Gerhard
Mike B. schrieb:> "expects a compile time integer constant">> uint16 i=1000;> ..> _delay_ms(i);>> schon mal probiert?
Glaube nicht, daß das funktioniert. Deswegen verlangt er ja
"a compile time integer constant". Und i ist eine Variable. Das
verlangte wäre eine Zahl in der Klammer. Das hat der TO allerdings schon
gemacht. Also muß meiner Meinung nach die Ursache woanders liegen.
> uint8_t var = 255;
uint16 i=1000;
beides sind m.W.n. Constanten-Deklarationen (in c++)
i ist eine integer-Constante,
der Wert ist zur Compile-Zeit bekannt
Mike B. schrieb:>> uint8_t var = 255;> uint16 i=1000;>> beides sind m.W.n. Constanten-Deklarationen (in c++)
Nein, weder in C, noch in C++ sind das Konstanten.
> i ist eine integer-Constante,
Nein. i ist eine Integer-Variable.
> der Wert ist zur Compile-Zeit bekannt
Im Kontext von Standard-C nicht. Der Optimizer weiß aber natürlich, was
der Wert ist, wenn er später benutzt und zwischendrin nicht mehr
verändert wurde.
Mike B. schrieb:> na dann> const uint16 i=1000;>> Es wäre nett gewesen, wenn Herr R. Magnus sein besseres Wissen auch mit> uns geteilt und dies gleich korrigiert hätte.
Hab ich doch schon gemacht, direkt im nächsten Beitrag.
Das reicht wohl nicht? :-)
Mike B. schrieb:> na dann> const uint16 i=1000;
Ist auch nur bei C++ eine Konstante, die tatsächlich diesen Namen
verdient. Bei C ist es nur eine nicht modfizierbare Variable.
Den Unterschied merkst du, wenn du sowas mal probierst:
Jörg W. schrieb:> Mike B. schrieb:>> na dann>> const uint16 i=1000;>> Ist auch nur bei C++ eine Konstante, die tatsächlich diesen Namen> verdient. Bei C ist es nur eine nicht modfizierbare Variable.>> Den Unterschied merkst du, wenn du sowas mal probierst:> const int i = 1000;> int array[i];
ist nur die Frage, ob ihm das bei C als "integer const at compile time"
reicht
Mike B. schrieb:> ist nur die Frage, ob ihm das bei C als "integer const at compile time"> reicht
Nein.
Aber das ist (zumindest laut obigem Codestückchen) nicht des TEs
Problem.
Gerhard H. schrieb:> Fehleranzeige : /usr/lib/avr/include/util/delay.h|163|error:> __builtin_avr_delay_cycles expects a compile time integer constant
Kann ich nicht nachvollziehen, probiert mit avr-gcc v4.7, v4.8, v4.9, v6
und v7 mit folgenden Optionen: -O -mmcu=atmega32, teilweise auch -O3,
-O2.
Aber wie immer, erweist sich Raten als denkbar mieseste Alternative im
Vergleich dazu, vorhandene Informationen zu liefern (Optionen,
Compiler-Version, etc).
Gerhard H. schrieb:> Habe recherchiert und herausbekommen das ich nicht der Einzige bin der> vor diesen Rätsel steht, aber keine rechte Lösung gefunden .
Hast du mal ein paar Links zu den anderen, die genau dein Problem haben
(und nicht nur zu faul waren, die Doku zu lesen)?
Ansonsten ist ein üblicher Tipp immer, einen aktuellen AVR-gcc mit allem
Zubehör von Hand zu installieren. Die Versionen, die in den
Linux-Distributionen mitgeliefert werden, sind manchmal arg seltsam.
Oliver