Hallo!
Ich habe bisher kleinere Programme mit AVR-Studio progammiert und möchte
nun auf Eclipse umsteigen (AVR-Plugin).
Da GANZ einfache Programme schnell zum Laufen zu bekommen waren, habe
ich nun ein kleines Programm geschrieben, dass in einer Endlosschleife
Buchstaben auf ein RS232-Terminal ausgibt.
Und jetzt kommt das Problem:
Mit dem von Eclipse erzeugten HEX-File funktioniert die Ausgabe von
EINZELBUCHSTABEN mit printf("H") (beispielsweise) problemlos (natürlich
auch in ARV-Studio).
Ändere ich diese Ausgabe in printf("Ha") (also mehrere Buchstaben)
klappt es unter Eclipse NICHT MEHR, unter AVR-Studio schon.
Der C-Code ist (natürlich) in beiden Fällen gleich!
Daher kann es eigentlich nur an den (diversen) IDE-Einstellungen liegen
[dieses Problem hat man ja eigentlich immer, wenn man die IDE wechselt].
Was mir auffällt ist, dass Eclipse mit avr-g++ kompiliert (obwohl mein
Program unter Main.c gespeichert ist) und AVR-Studio mit avr-gcc (wobei
ich noch nicht sehe, wo dabei das Problem sein könnte).
Vielleicht kann einer von Euch mir da weiter helfen? Anbei findet Ihr
die beiden Makefiles.
Lieben Dank!
P.S.: Sorry für den langen Anhang aber ich war irgendwie nicht in der
Lage, zwei Dateien anzuhängen... und auf das Entpacken eines .zip hat
wahrscheinlich keiner Lust ;-)
Eclipse_makefile:
Hmm, dachte, dass interessiert niemanden, da es ja in beiden Fällen
identisch ist...
Aber kein Problem, kommt.
Danke schonmal für die schnelle Antwort!
1
// ============================ USART-Test for ATmega48 on STK500 valuation-board ===
2
3
#ifndef F_CPU
4
#define F_CPU 4000000 //Quarz frequency in Hz. Insert actual value!!
einmal gehts noch - usart.h bitte. Und woher sind usartPutc &
usartGetcNowait?
Ihr erwartet immer Hilfe und benehmt Euch dabei wie verlegene
Verdächtige, denen man erstmal die Tatsachen abpressen muss..
-mah
;-)
Ich habe gar kein schlechtes Gewissen! Denke nur (nach wie vor), dass
der Fehler nicht im CODE liegen kann, da es ja im AVR-Studio läuft, nur
halt unter Eclipse nicht => Makefile-Unterschiede.
Aber klar, könnt Ihr den Code sehen:
1
#ifndef USART_H
2
#define USART_H
3
4
//TODO: Add comments for this class
5
6
#include<avr/interrupt.h>
7
8
#include"GeneralAtmelMcu.h"
9
#include"ErrorHandling.h"
10
11
12
// ================== Definitions for UART ================================
Die putc()-Funktion kann nur jeweils nur einen Character senden (denke
das ist auch allgemein so üblich). Printf() ruft dann für jeden char die
angegebene putc() auf.
Tobias H. wrote:
> Da GANZ einfache Programme schnell zum Laufen zu bekommen waren, habe> ich nun ein kleines Programm geschrieben, dass in einer Endlosschleife> Buchstaben auf ein RS232-Terminal ausgibt.
Alles klar, unter einfach versteh ich aber was anderes.
Du hast ja Ringbuffer und Printf Unterstützung eingebaut. Versuch doch
mal erst mal mit einer normalen Schreibfunktion und grenze den Fehler
ein.
Argh, sorry, aber das ist einer der Gründe dafür gewesen, dass ich das
Programm ursprünglich NICHT posten wollte.
DENN: wenn man mal hinsieht, verwende ich Ringbuffer, etc. in meinem
main gar nicht! Die einzigen Funktionen, aus der Uart.h, die in meinem
main aufgerufen werden, sind init() und putc(), der Rest NICHT. Daran
kann es also nicht liegen. (Ich hätte den Rest gar nicht zeigen
sollen...)
Und ausserdem funktioniert das alles unter AVR-Studio wunderbar! Die
Frage ist und bleibt, warum es in Eclipse nicht läuft, bzw. warum nur
mit einzelnen Buchstaben.
Also nochmal: Woran könnte es liegen, dass IDENTISCHER Code unter
AVR-Studio auf dem Controller anständig läuft und unter Eclipse eben
nicht? Meiner Meinung nach kann es nur an den Makefiles liegen (s.o.)?
Tobias H. wrote:
> Argh, sorry, aber das ist einer der Gründe dafür gewesen, dass ich das> Programm ursprünglich NICHT posten wollte.
Hä? Bleib mal auf dem Teppich.
> DENN: wenn man mal hinsieht, verwende ich Ringbuffer, etc. in meinem> main gar nicht!
Na klar, Printf ruft die Ringbuffer Funktionen auf.
> Und ausserdem funktioniert das alles unter AVR-Studio wunderbar! Die> Frage ist und bleibt, warum es in Eclipse nicht läuft, bzw. warum nur> mit einzelnen Buchstaben.
Das hat zu 99% nichts mit AVR Studio oder Eclipse zu tun. Das ist nur
ein Symptom, welches du siehst. Das Problem wird an einer
unterschiedlichen Kommandozeile liegen und an Optionen, die beim
Kompilieren mitgegeben werden. Dadurch tritt der Fehler zufällig einmal
auf, und einmal nicht.
> Also nochmal: Woran könnte es liegen, dass IDENTISCHER Code unter> AVR-Studio auf dem Controller anständig läuft und unter Eclipse eben> nicht? Meiner Meinung nach kann es nur an den Makefiles liegen (s.o.)?
Ich vermute den Fehler in den Ringbuffer Funktionen. Wo hast du diese
her? Sind die getestet? Ich habe mir die nicht angeschaut, aber ich
schlage vor, dass du die erst mal raus machst und an FDEV_STREAM_SETUP
eine ganz stinknormale uart_putc funktion reingibst.
Übrigens, was heißt "Funktioniert nicht"? Ich muss da Michael Haberler
schon Recht geben, mit der Geheimniskrämerei kommt man nicht weit.
Wie gesagt: Fehler eingrenzen ist die Devise. Und zwar bei jedem Fehler,
du kannst ja nicht bei jedem Fehler jemand anders fragen.
Hallo Simon,
entschuldige bitte. Das "Argh" und so weiter war kein Vorwurf. Eher an
mich gerichtet, weil ich den Code vorher hätte "filtern" sollten, um
Mißverständissen vorzubeugen (ich will doch nix verheimlichen!).
Ich bin sehr dankbar für die Existenz solcher Foren und für die Hilfe,
die einem von Forenteilnehmern gewährt wird.
Da ich mich offensichtlich unglücklich ausgedrückt habe, hier nochmal
das Problem:
1. Der obige Code kompiliert unter AVR-Studio (mit dem avr-gcc) und
Eclipse (hier mit dem avr-g++, weiß nicht, wie man das ändert)
fehlerfrei.
2. Mit Hilfe des AVR-Studios habe ich meinen Controller programmiert und
das Programm getestet (es macht ja nichts ausser einer sich endlos
wiederholenden Ausgabe von "Ha" auf dem Hyperterminal eines
angeschlossenen Rechners). So funktioniert es prima.
3. Meine Uart.h besteht schon seit ein paar Wochen und die darin
enthaltenen Funktionen zum Empfangen von Daten habe ich auch schon
genutzt (den Ringbuffer hat ein Kollege geschrieben...) und deren
korrekte Funktion getestet.
4. Punkt 3 ist insofern irrelevant, als ich der Meinung bin, dass ausser
den init() und putc() Funktionen KEINE weiteren Funktionen dieser Datei
von meinem main aufgerufen werden. Soweit ich weiß, ruft printf() NICHT
getc() oder eine andere, mit dem Empfangen von Daten verbundene Funktion
auf. Natürlich kann ich da irren aber in dem Fall wäre ich für eine
Erklärung dankbar, da dann etwas ganz anders läuft, als ich dachte.
5. Sobald ich den Code mit Eclipse kompiliere und dann auf den
Controller programmiere, geht es schief und auf dem Terminal landet
nichts mehr.
6. Ändere ich die printf("Ha")-Anweisung in printf("H"), so läuft das
Programm wieder einwandfrei.
7. Da der Quellcode beider IDEs identisch ist, kann es nur an den
IDE-Einstellungen liegen, aus denen ja in beiden Fällen das Makefile
erstellt wird.
Dieses Makefile definiert die exakte Form der avr-gcc/avr-g++
Kommandozeile. Sind die Makefiles unterschiedlich, resultieren
unterschiedliche Kommandozeilen und damit ergibt sich eine mögliche
Fehlerursache.
Liebe Grüße und besten Dank für die Hilfe.
>Sind die Makefiles unterschiedlich, resultieren>unterschiedliche Kommandozeilen und damit ergibt sich eine mögliche>Fehlerursache.
Schau dir die Compileraufrufe doch einfach an, dann weisst du, ob es da
Unterschiede gibt. So viele Möglichkeiten gibt es da gar nicht. Kandidat
ist z.B die signed oder unsigned-definition des Typs char. Wobei das
nicht fest vorgegeben ist, sondern in den Settings bzw. Optionen
eingestellt werden kann.
Sollte es allerdings daran liegen, liegt es trotzdem an deinem Programm.
Das muß so geschrieben sein, daß es mit beiden Varianten funktioniert.
Oliver
Kompilieren lässt sich der Code nicht, da fehlt die Hälfte. Also such
deine Fehler selber. In deinem Code, nicht in den makefiles. Die sind in
Ordnung.
Und dann hinsetzten und tausendmal schreiben:
Ich soll keine .c-Files includen - auch nicht, wenn sie als headerfiles
getarnt sind.
Oliver
>Sobald ich morgen wieder an den>Rechner komme, werde ich die Kommandozeilen mal vergleich und hier>posten.
???
Die stehen doch in deinen makefiles.
Oliver
Ich hatte halt gehofft, dass jemand das Problem kennt und direkt sieht:
"ah, da musst du das Flag XY noch setzen". Will doch von niemandem
verlangen, meinen Code zu kompilieren.
Da ich aber langsam einsehe, dass das vielleicht sogar der einfachere
Weg ist, werde ich morgen ein minimalistisches und hoffentlich dann auch
kompilier-/reproduzierbares Paket posten.
@header-Files: mea culpa. Sollte allerdings keinerlei Probleme machen,
da der Compiler das meines Wissens nach einfach implizit "inlined".
Warum es überhaupt soweit kam? Lange Geschichte, die was mit geerbtem
Code zu tun hat... ;-)
>Lange Geschichte, die was mit geerbtem Code zu tun hat... ;-)
In der Zeit, in der du diesen Beitrag hier geschrieben hast, hättest du
schon die UART-Funktionen in ein .c und ein .h aufteilen können. Die
passende Struktur ist da ja schon drin. Mach das mal, dann sieht es
gleich viel besser aus.
Oliver
Tobias H. wrote:
>> Was mir auffällt ist, dass Eclipse mit avr-g++ kompiliert (obwohl mein> Program unter Main.c gespeichert ist) und AVR-Studio mit avr-gcc (wobei> ich noch nicht sehe, wo dabei das Problem sein könnte).
Tobias, Du hast, als Du das Projekt angelegt hast, (wahrscheinlich aus
versehen) 'C++ Project' ausgewählt. Damit wird dann der C++ Linker
anstatt des normalen C Linkers benutzt. Ob das was mit Deinem Problem zu
tun hat weiß ich nicht, aber es kann nicht schaden das zu korrigieren.
Dazu gibt es zwei Möglichkeiten:
1. Offizieller und sicherer weg: Neues 'C Project' anlegen, die Sourcen
dorthin kopieren und die Einstellungen anpassen.
2. Inoffizieller 'Hack' (auf eigene Verantwortung): In der Datei
'.project' im Projektverzeichnis die Zeile
1
<nature>org.eclipse.cdt.core.ccnature</nature>
löschen. Wichtig: nicht die Zeile mit cnature löschen, sondern nur die
mit ccnature (zwei c am Anfang)
Anschließend Eclipse neu starten (oder das Projekt schließen und wieder
öffnen).
Die Datei '.project' wird nur im "Navigator" angezeigt (Window->Show
View->Navigator)
Thomas
Hallo Thomas!
Entschuldige die späte Antwort, ich war auf Reisen.
Habe Deinen Rat beherzigt und aus dem Eclipse-C++-Projekt ein C-Projekt
gemacht (gemäß Deinem "Hack"...).
Tatsächlich FUNKTIONIERT der Code dann auch unter Eclipse, unabhängig
davon, wieviele Buchstaben man mit printf() sendet (zur Erinnerung:
printf("H") funktionierte unter Eclipse UND AVR-Studio, printf("Ha") nur
unter AVR-Studio)!
Insofern möchte ich mich ganz herzlich bei Dir aber auch allen anderen
Hilfsbereiten Beantwortern bedanken!
Falls jemand dieses Verhalten näher untersuchen möchte, hier nochmal
meine Main.c, in einer Version in der keine weiteren Dateien gebraucht
werden (Atmega640):
1
// ============================ USART-Test for ATmega640 =========
2
3
#ifndef F_CPU
4
#define F_CPU 4000000 //Quarz frequency in Hz. Insert actual value!!
//printf("H"); //if you put one letter like "H" it works (Both IDEs)
60
printf("Ha");//if you put more then one letter, like "Ha", it doesn't work under eclipse any more!
61
//(it still works under AVR-Studio)
62
_delay_ms(10);
63
}
64
65
return0;
66
}
Da es ja prinzipiell möglich zu sein scheint, C++-Programme für den
Atmega zu kompilieren, könnte es etwas mit extern "C" { ... } zu tun
haben, wie auf der AVR-GCC-Wiki angedeutet?
Liebe Grüße