Forum: Compiler & IDEs codeblocks meckert bei _delay_ms()


von Gerhard H. (oderlachs)


Lesenswert?

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
int main( void )
14
{
15
    DDRB =  0xFF ;          // PB0 an PORTB als Ausgang setzen
16
    PORTB = 0xFF;
17
  uint8_t var = 255;
18
    while( 1)               // Endlosschleife
19
    {
20
21
    PORTB = var;            // schreibe Variable in PORTB z.&nbsp;B. angeschlossene LEDs
22
    
23
    _delay_ms(1000);        // Eine Sekunde warten...
24
    --var;
25
  if (var <= 0)
26
  {
27
  var = 255;
28
    }
29
 }
30
    return 0;
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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vergessen, die Optimierung einzuschalten?

von Gerhard H. (oderlachs)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard H. schrieb:
> Optimierung ist an

Welche genaue Kommandozeile wird denn beim Compilieren benutzt?
Die wird ja das Code::Blocks hoffentlich irgendwo zeigen.

von Gerhard H. (oderlachs)


Lesenswert?

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

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

"expects a compile time integer constant"

uint16 i=1000;
..
_delay_ms(i);

schon mal probiert?

von Huh (Gast)


Lesenswert?

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.

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

> 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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Huh (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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:
1
const int i = 1000;
2
int array[i];

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

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

von Gerhard H. (oderlachs)


Lesenswert?

Bin leider krank, denke mal ich kann bald ausführlich antworten....

Vielen Dank für die Mithilfe bislang.
Gerhard

: Bearbeitet durch User
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.