Forum: Mikrocontroller und Digitale Elektronik Undefined external "__delay_cycles" referred in delay


von Benjamin H. (faza)


Lesenswert?

Guten Abend zusammen,

ich hatte vor ein Projekt zu testen.

Leider bekomme ich die folgende Fehlermeldung:

Error[e46]: Undefined external "__delay_cycles" referred in delay ( 
C:\Users\...\Desktop\...\Debug\Obj\delay.r43 )

In verschiedenen anderen Foren, hatten die Leute das Problem, dass sie 
nur ein '_' Unterstrich benutzt haben. Dieses habe ich aber schon 
behoben.


Hier die eine Funktion:
1
void wait_ms(unsigned int m_sec)
2
{
3
  while(m_sec--)
4
        {
5
    __delay_cycles(32000);  
6
        }
7
}
8
9
void wait_us(unsigned int u_sec)
10
{
11
  while(u_sec--)
12
        {
13
    __delay_cycles(32);    
14
        }
15
}


Danke im voraus.

von Andreas H. (ahz)


Lesenswert?

Benjamin H. schrieb:
> ich hatte vor ein Projekt zu testen.

Gute Idee.

>
> Leider bekomme ich die folgende Fehlermeldung:

Och, das ist ja ärgerlich.

Grüße
Andreas

P.S:
Hattest Du eine sinnvollere Antwort erwartet, wenn du nicht verrätst 
womit Du überhaupt arbeitest ?

Nur falls es Dir noch nicht aufgefallen ist: Es gibt mehr als nur EINEN 
Prozessor (angeblich sogar mehr als zwei).

von Jim M. (turboj)


Lesenswert?

Solche Makros/Functions hießen je nach Platform, Compiler und LibC immer 
anders. In Deiem Beitrag steht dazu leider nix.

Mitunter muss man die als Fingerübung selber erstellen.

von Peter II (Gast)


Lesenswert?

um welche CPU geht es?

bei Atmel verwendet man eigentlich nicht delay_cycles. Das macht ja auch 
wenig sinn, weil das abhängig von CPU-Takt ist wie lange er wartet.

da kann man einfach _delay_ms oder _delay_us verwenden.

http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

avr-gcc kennt
1
void __builtin_avr_delay_cycles (unsigned long)
als Built-in Funktion.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> um welche CPU geht es?
>
> bei Atmel verwendet man eigentlich nicht delay_cycles. Das macht ja auch
> wenig sinn, weil das abhängig von CPU-Takt ist wie lange er wartet.

Und vor allen Dingen, weil der Compiler das ausrechnen kann, wenn er die 
gewünschte Zeit und die Prozessorfrequenz kennt.

Wenn ich schon ein delay benutze (was in Ausnahmefällen tatsächlich 
sinnvoll sein kann), dann interessiert mach ja im Normalfall überhaupt 
nicht, wieviele Prozessorzyklen das sind, sondern ich soll eine Zeit 
mehr oder weniger genau einhalten.

von Clemens L. (c_l)


Lesenswert?

Meine Kristallkugel sagt, dass du IAR für MSP430 benutzt und das 
"#include <intrinsics.h>" vergessen hast.

von Benjamin H. (faza)


Lesenswert?

Hallo zusammen,

ich vergaß total zu erwähnen dass es sich um den MSP430 handelt.
Sry für die Umstände.


Clemens L. schrieb:
> Meine Kristallkugel sagt, dass du IAR für MSP430 benutzt und das
> "#include <intrinsics.h>" vergessen hast.

Ja danke für den Tipp, leider hat das auch nciht funktioniert.

von Clemens L. (c_l)


Lesenswert?

Benjamin H. schrieb:
> leider hat das auch nciht funktioniert.

Und beim Kompilieren kommt keine Fehlermeldung? Hast du mal die 
Warnungen angeschaltet?

von Benjamin H. (faza)


Lesenswert?

Clemens L. schrieb:
> "#include <intrinsics.h>" vergessen hast.

Hab nun das intrinsics.h in die richtige Funktion eingebunden, dachte es 
wäre nötig und ausreichend das nur in der main.c einzubinden.

Und siehe da, es funktioniert :)


Vielen Dank für die Hilfe.

von Clemens L. (c_l)


Lesenswert?

Benjamin H. schrieb:
> Hab nun das intrinsics.h in die richtige Funktion eingebunden

Autsch!

Ein #include gehört praktisch nie in eine Funktion. Schau dir einfach 
mal irgendein Beispiel an; diese Anweisungen stehen am Anfang der 
Datei.

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.