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


von TestX .. (xaos)


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:
1
Building file: ../bimaq/io/USART.cpp
2
Invoking: AVR C++ Compiler
3
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"
4
Finished building: ../bimaq/io/USART.cpp


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


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

von Karl H. (kbuchegg)


Lesenswert?

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

von TestX .. (xaos)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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.

von TestX .. (xaos)


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^^

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


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.

von TestX .. (xaos)


Angehängte Dateien:

Lesenswert?

hm strange..

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

hab mal den generierten release branch angehängt

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


Lesenswert?

> gcc version 4.3.2 (WinAVR 20081205)

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

von TestX .. (xaos)


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 ?

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


Lesenswert?

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

von TestX .. (xaos)


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

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


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.

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.