www.mikrocontroller.net

Forum: Compiler & IDEs avr-g++ mehrere .cpp Dateien -> Fehler(AVR freeze)


Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich habe ein problem, dass der controller stehen bleibt (FREEZED) sobald 
ich den code auf mehrere sourcefiles aufteile..solange alles in der 
main.cpp ist geht es.

die anderen .cpp datein werden auch compiliert:
Building file: ../bimaq/io/USART.cpp
Invoking: AVR C++ Compiler
avr-g++ -I"C:\Development\AVR\testcplusplus\bimaq" -I"C:\Development\AVR\testcplusplus\bimaq\io" -Wall -O2 -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -fno-exceptions -mmcu=atmega64 -DF_CPU=16000000UL -MMD -MP -MF"bimaq/io/USART.d" -MT"bimaq/io/USART.d" -c -o"bimaq/io/USART.o" "../bimaq/io/USART.cpp"
Finished building: ../bimaq/io/USART.cpp


und am ende gelinkt :
Building target: testcplusplus.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,testcplusplus.map,--cref -mmcu=atmega64 -o"testcplusplus.elf"  ./main.o  ./bimaq/io/USART.o  ./bimaq/String.o   
Finished building target: testcplusplus.elf


der code sollte also eigentlich identisch sein...
hoffe jemand kann mir einen tipp geben, danke schonmal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wirst du wohl irgendeinen Fehler in deinem Code haben.
Ich tippe mal auf Zeile 42

Autor: Andi ... (xaos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Da wirst du wohl irgendeinen Fehler in deinem Code haben.
> Ich tippe mal auf Zeile 42

nah dran glaub es ist 43 ;)
ne mal im ernst irgendwie glaub ich weniger, dass es die sources sind.
häng sie trotzdem mal an, inzwischen hab ich äußerst merkwürdige fehler, 
so nach dem motto "1ne zeile mehr, die nichts macht => controller 
freeze"...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast recht.
Die Sourcen sind grundsätzlich in Ordnung.
Dürfte wirklich in irgendeiner Compiler- oder Linker-Einstellung liegen. 
Hab allerdings noch nie den avr-g++ benutzt.
Mal warten bis Jörg online kommt, der kennt sich da besser aus.

Kannst du mit LED einschalten feststellen, wo das Problem liegt?

(Ein µC kann nicht freezen. Irgendwas macht der immer. Die Frage ist nur 
was :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber noch ein paar Tipps.

String String::operator= (char* s) {

hat den falschen Returntyp. Der op= returniert eine Referenz

String& String::operator= ( const char* s ) {

Wenn du C++ arbeitest, gewöhn dir von Anfang an an, const korrekt zu 
arbeiten. Du willst einen konstanten String mittels op= an den String 
binden. Dazu sollte das Argment auch const sein (dein ein String Literal 
ist grundsätzlich const. Lediglich aus Abwärtskompatibilitätsgründen zu 
altem C, wird es ausnahmsweise toleriert einen const char* an einen 
char* zuzuweisen.)


In grundsätzlich jedem Konstruktur solltest du darauf achten, dass alle 
Member Variablen initialisiert werden. Pointer auf NULL setzen!


Meine persönliche Meinung: Wenn in Memberfunktionen der this Pointer 
benötigt wird, um kenntlich zu machen, dass man auf eine Membervariable 
zugreift, dann sollte man sein Benamungsschema für Variablen überdenken.


Das deine String Klasse, sagen wir mal zweifelhaft ist, weisst du 
wahrscheinlich selber. So wie sie zur Zeit ist, eignet sie sich nur 
dazu, konstante Strings (also String Literale) zu verwalten.


In C++ benötigt eine Funktion genauso wie in C kein abschliessendes ;
char String::getChar(int index){
  return (char) *(this->s+index);
};     <----- dieses ';' ist überflüssig


Aber alles das kann den Hänger nicht erklären.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs mit den leds jetzt noch nicht konkret ausprobiert, nur gemerkt, 
dass sie auf einmal nichtmehr blinken^^

was auchnoch sehr komisch ist, ist zB wenn man der USART class als 
parameter 1 übergibt, sobald er dann in das if statement geht und die 
zeile fürs setzen der register da ist (in den sources drinnen) taucht 
der gleiche effekt auf. ist die zeile weg ists ok und die leds blinken 
(sources der usart class in der main.cpp).
und das beste: fehler solcher art gibt es äußerst viele umso mehr ich 
versuche...

wollte eigentlich ein wenig mehr highlevel proggn nur ich glaube, dass 
das irgendwie garnicht geht.. :(



edit: ja ich weiss, dass die sources bes***** sind atm ;)
lerne gerade mal c, c++ ... wenn man das der java, php ecke kommt ists 
eine echte umgewöhnung..^^ daher bin ich auch das this gewöhnt..^^
sobald ich vernünftig arbeiten könnte an den sources (ohne "freeze") 
mach ich die in vernünftig^^

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Mal warten bis Jörg online kommt, der kennt sich da besser aus.

Ich würde vermutlich den Debugger anschmeißen und gucken, wo er
hängt.  Wollte es gerade mal bauen, hmm, kein Makefile dabei.
Hab' mir eins gezimmert, und den ganzen Kladderadatsch in den
Simulator geschickt.  (Der simuliert einen ATmega128, aber der
ATmega64-Code sollte dazu ja binärkompatibel sein.)  Das Teil
tut, ich komme regelmäßig an den beiden PORTB=-Anweisungen vorbei.

Damit stellt sich die Frage, welche Compilerversion benutzt worden
ist.

Autor: Andi ... (xaos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hm strange..

gcc version 4.3.2 (WinAVR 20081205)
mit eclipse CDT, also autogenerated makefile

hab mal den generierten release branch angehängt

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> gcc version 4.3.2 (WinAVR 20081205)

Dann nimm mal bitte das aktuelle WinAVR, da sind noch einige Bugfixes
in den Compiler reingekommen.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so hab jetzt mal die neue version genommen, mit dem atmega64 geht es 
immernochnicht.

hab spaßes halber mal nen at90can128 genommen und siehe da es geht alles 
?!
kann mir das mal jemand erklären ?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sach mal, du hast aber die M103C-Fuse nicht noch zufällig eingeschaltet?

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... mich aufn kopf hau
diese blöde fuse war per factory default gesetzt.....


jetzt läufts auch aufm atmega64....
danke für den tipp :=)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi D. wrote:
> ... *mich aufn kopf hau*
> diese blöde fuse war per factory default gesetzt.....

Ja, ich weiß.  Daher bin ich ja dann auch auf die Idee gekommen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.