avr-g++ mehrere .cpp Dateien -> Fehler(AVR freeze)

OP #1207860
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
OP #1208368
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"...
Angehängte Dateien:
#1208403
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 :-)
#1208416
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.
OP #1208417
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^^
Moderator Persönliche Seite #1208634
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren