Forum: Mikrocontroller und Digitale Elektronik AVR 5 Breakpoint Problem


von Merve B. (student1990)


Lesenswert?

Hallo,

ich bin relativ neu in der Welt von ATMEL und arbeite zum ersten mal mit 
AVR 5. Wie auch immer :)
Ich kann leider mein Programm nicht richtig testen, da AVR 5 nicht auf 
die Breakpoints, die ich setze, springt.
Wenn ich ein Breakpoint setze und es debugge, greift er auf ein 
"Programm" zu, das nur Register beinhaltet und kommt gar nicht auf das 
Programm rein, das ich geschrieben habe. Ich verstehe aber nicht ganz 
warum.
Die Breakpoints, die ich da rein setze, auf die springt er, aber er 
kommt irgendwie nicht in das Programm rein, wo es hin soll.
Ich wäre über jede Hilfe dankbar, da ich schon seit Tagen da rumspiele, 
aber zu keinem Ergebnis komme und es macht mich langsam wahnsinnig.

Vielen Dank und einen schönen Tag

von Thomas B. (nichtessbar)


Lesenswert?

AVR 5 == Atmel Studio 5?

Warum nicht das 6er?

von Sauger (Gast)


Lesenswert?

Mahlzeit,

Merve Bulut schrieb:
> Wie auch immer :)

Merve Bulut schrieb:
> Ich verstehe aber nicht ganz warum.

und wir nicht was du willst.
Sag mal was du machst. C,Assembler,Jtag,Simulator usw.

MfG

von Merve B. (student1990)


Lesenswert?

Tut mir Leid :)

also ich programmiere in C und mit dem JTAG (also nicht Simulator).
Und ja AVR Studio 5 (ich soll das mit dem machen, weil es mein Prof. 
gesagt hat )
Also ich soll ein Programm erweitern. Diese hat keine main. Wurde mit 
den sogenannten APPs geschrieben.
Wie gesagt, wenn ich Breakpoints setze im Programm, geht er auf eine 
Seite (Disassembly) und greift nicht auf mein Programm zu.
Ich drück dann auf F10, der geht zwar Schritt für Schritt, aber er ist 
hartnäckig darin nicht auf mein Programm überzugehen.
Ich hoffe, dass ihr ungefähr eine Vorstellung habt, was mein Problem 
ist.

Danke

von Thomas B. (nichtessbar)


Lesenswert?

C und kein main is irgendwie ein KO-Kriterium, ein wunder dass da 
irgendwas kompiliert, und das was du in den uC lädst ist vermutlich kein 
Executable sondern einfach ein paar zusammengewürfelte Funktionen..

Poste mal den Code oder lad am besten das ganze Projekt als Zip hoch 
dann kann dir vl. wer helfen.. aber warum nicht einfach den Professor 
fragen?

APPs sagen mir in Zusammenhang mit Atmel gar nix, meinst du vl. APIs?

von Merve B. (student1990)


Lesenswert?

Sorry, ich meinte API.

von Thomas B. (nichtessbar)


Lesenswert?

API .. application programming interface und bedeutet im wesentlichen 
Programmierschnittstelle. Hat jetzt mit dem Programm an sich und dem 
Debuggen wenig zu tun

Die int main() Funktion eines C-Programms ist der Einsprungpunkt, da 
fängt der Prozessor beim Einschalten (=Spannungsversorgung) an - salopp 
gesagt.

Fehlt die main, fängt der Prozessor einfach bei dem befehl auf Adresse 
0x0000 an, und das ist vermutlich das was du jetzt im Disassembly 
siehst.

Kann man sich alles in List- und Mapfiles anschaun, denke das ist für 
dich aber jetzt zum Anfange etwas zu viel - Tatsache ist, ohne main() 
geht nix, da läuft der Prozessor irgendwo im Gemüse herum aber sicher 
nicht in deinem Programm, das evtl. zwar irgendwo im Speicher liegt, 
aber nicht erreicht wird, daher auch kein Debuggen ;)

von Merve B. (student1990)


Angehängte Dateien:

Lesenswert?

Das Problem ist, dass sich in AVR5 mein Prof sich nicht so genau 
auskennt und derjenige der das Programm geschrieben hat (also es war 
seine Bachelor-Arbeit) ist nicht mehr da.
Das Programm von ihm an sich funktioniert einwandfrei, bloß wenn ich 
dann Breakpoints setze gehts nicht.
Ich darf leider nicht das ganze Projekt hochladen, aber ich schicke mal 
Teile aus dem Programm.
Ich hoffe, ihr versteht das und wirklich danke, dass ihr mir helfen 
wollt.
Bin gerade wirklich in der Zwickmühle.
So genug geredet, schicke mal Teile vom Programm.
Anbei ist auch ein Screenshot, wenn ich versuche zu debuggen.

Danke

von Merve B. (student1990)


Lesenswert?

Und wie kommt es, dass sein Programm ohne main() funktioniert?
Ich habe mich auch gewundert, aber er hat wirklich keine main().
Sagen wir mal, es liegt daran, dass es keine main() hat. Wie kann
ich dann das Problem lösen?

von Thomas B. (nichtessbar)


Lesenswert?

Sicher dass nicht in irgendeiner der anderen Sourcedateien eine Main 
ist?
Du kannst im Disassembly schaun was an der Adresse 0x2A2 ist, das ist 
der erste Befehl des main... wenn da nix steht hast du ein Problem.

Was natürlich sein kann ist auf dem Board ein Bootloader oder ähnliches 
läuft? Darfst du List- und Mapfile hochladen?

Zur Erklärung: Der Prozessor startet - wie erwähnt - immer an Adresse 0, 
dort steht ein Jump auf 0x2A2, dort sollte also deine Main sein - der 
GCC kompiliert C-Dateien immer so, dass er auf Adresse 0 den Jump auf 
den ersten Befehl der main setzt. - Alternativ dazu kann er irgendwo in 
die Bootloader-Section springen, das wären dann allerdings wesentlich 
höhere Adressbereiche.

Ohne Main ginge z.b. auch noch - was ich aber nicht glaube - wenn 
Assembler und C-Part irgendwie gemischt wären, oder die "Main" schon fix 
am Prozessor ist und über GCC-Option ein Offset für das ganze C-Programm 
angegeben wird.. Musstest du das "Erase before Program" Häckchen 
entfernen? Das könnte erklären warums beim Debuggen nicht funktioniert, 
weil du dann den schon im prozessor befindlichen Programmteil 
überschrieben hättest.
Diesen Absatz halte ich allerdings für ein eher utopisches Szenario..

Ich kann dir leider ohne das komplette Projekt nicht wirklich helfen, 
das ist Fischen in trübem Gewässer ohne Angel ;)

von Peter II (Gast)


Lesenswert?

Thomas Bergmüller schrieb:
> der
> GCC kompiliert C-Dateien immer so, dass er auf Adresse 0 den Jump auf
> den ersten Befehl der main setzt.

das galube ich nicht. Vor der Main gibt auch auch schon code - da werden 
globale variabeln initalisiert. Main kommt erst danach.

von Sauger (Gast)


Lesenswert?

Nabend,

ohne main() geht es nicht. Durchsuche mal die Dateien im Projektordner, 
mit Windows Boardmitteln, auf die Zeichenkette "main". Wenn diese nicht 
zu finden ist hast du wohl nur Fragmente und kein Projekt bekommen.

Ohne main() kann der Linker kein auf den Target ladbares Image erzeugen 
(sollte eine Fehlermeldung geben).

Das was du API nennst ist ein header.

MfG

von Thomas B. (nichtessbar)


Lesenswert?

Peter II schrieb:
> das galube ich nicht. Vor der Main gibt auch auch schon code - da werden
> globale variabeln initalisiert. Main kommt erst danach.

Stimmt natürlich..

von Sauger (Gast)


Lesenswert?

Nabend,

nennt sich StartUp Code, der die Voraussetzungen für die CRTL (C- 
Laufzeitbibliothek) schafft. Eventuell hat er was Sonderbares geerbt, 
oder versucht ein Programm für #42 auf einem AVR zum Laufen zu bringen 
:-)


MfG

von Merve B. (student1990)


Lesenswert?

Vielen Dank. Ich werde morgen früh, wenn ich wieder im Labor bin, danach 
suchen. Ich hoffe ich werde fündig und ich werde auch morgen fragen, ob 
ich
die List- und Mapfile hochladen darf.
Ich habe schon das ganze Projekt bekommen, bloß von einer main() habe 
ich eigentlich nichts gesehen. Ich hab auch danach gefragt, aber mir 
wurde gesagt, dass es keine main() gibt. Vielleicht habe ich das auch 
falsch verstanden.

Ich weiß gar nicht, was ich mir dabei gedacht habe, eine Studienarbeit 
anzunehmen, in der ich so gut wie Null Erfahrung habe.
Ich dachte, es würde ja schon gehen. Ist ja nur ein kleiner Teil, den 
man programmieren muss, aber dass es so ausartet hätte ich nicht 
gedacht.
Jetzt ist es zu spät, meine Arbeit wurde schon angemeldet :(
Wirklich vielen Dank, dass ihr mir versucht zu helfen. Ich hoffe, ich 
bekomme das irgendwie hin.

Schönen Abend

von Thomas B. (nichtessbar)


Lesenswert?

Naja - mal ganz naiv gedacht ... Vielleicht hat man dir den Programmcode 
als "Bibliothek" mit bestimmten Funktionen gegeben und erwartet von dir 
dass du den Programmablauf (=> main()) erst implementierst? Sprich man 
hat dir Programmteile gegeben aber kein lauffähiges Programm?

von Merve B. (student1990)


Lesenswert?

Nein, ist schon ein "fast fertiges" Programm. Meine Aufgabe besteht 
darin, das ganze zu "automatisieren".
Im Moment muss man die Taster betätigen, dass da irgendwas läuft. Ich 
muss das ganze so programmieren, dass man keine Taster mehr betätigen 
muss (außer für den Start/Stopp).
Ich werde später Signale empfangen, die auswerten und jenachdem soll 
dann das Programm ablaufen.
Ich habe noch einmal geschaut im Projekt, aber da ist wirklich keine 
main() drin. :(

von Merve B. (student1990)


Angehängte Dateien:

Lesenswert?

Also ich habe nochmal gefragt, wie das sein kann ohne main().
Mir wurde gesagt, dass es über Tasks läuft. Es wurde so konfiguriert, 
dass man keine main() braucht.
Das Problem dabei ist, dass es keine StartUp Datei gibt. Somit seh ich 
nicht, bzw. weiß ich nicht, wo er dann startet (LEIDER).
Ich habe die MAP-Datei gefunden, werde sie hochladen, aber irgendwie 
existiert keine List-Datei, was ich auch ziehmlich seltsam finde...

von Thomas B. (nichtessbar)


Lesenswert?

Dann kann sich das Ding aber auch nicht übersetzen lassen...

Kopier mal den Output des Übersetzungsvorganges (Rebuild) hoch, das ist 
der der im breiten Fenster unten (Console) angezeigt wird.

Aber mal ganz ehrlich, wo bzw. was studierst du, dass dir Professoren 
bei solchen einfachen Problemen nicht weiterhelfen können? Was Richtung 
Elektronik / Informatik kanns nicht sein, zumindest nix wo ab und zu mal 
was programmiert wird im Regelfall, oder?

von Merve B. (student1990)


Angehängte Dateien:

Lesenswert?

Danke.
Ich studiere Mechatronik mit dem Schwerpunkt Automatisierungstechnik.
Bisschen was habe ich schon damit zu tun, aber ist ziemlich selten.
Jetzt wollt ich was in der Richtung machen, weil es mich eigentlich 
interessiert, aber ich hätte vielleicht besser in meinem Gebiet bleiben 
sollen :)

von Sauger (Gast)


Lesenswert?

Mahlzeit.

Es gibt den StartUp Code. Ist im  Mapfile unter Sektion .init 0-9 gut zu 
erkennen. Die main steckt in der libBcAll.a, wenn du die Quellen der lib 
nicht hast ist diese unzugänglich. Du solltest dir also die Doku zu den 
Bibliotheken besorgen, sonst stocherst du Weinachten noch im dunklen :-)

MfG

von Merve B. (student1990)


Lesenswert?

Guten morgen,

@Sauger
Ich habe libBcAll.a gefunden. Darin ist eine main.o - Datei.
Was anderes mit main habe ich nicht gefunden.
Ich habe nur nicht ganz verstanden, was ich damit anfangen soll.
Ich habe versucht es zu öffnen, aber viel hat es mir nicht gebracht.
Ich weiß, ich fange bestimmt an zu nerven, aber außer vom Forum bekomme 
ich keine Hilfestellung.
Es tut mir wirklich Leid.

Schönen Tag

von Peter D. (peda)


Lesenswert?

Merve Bulut schrieb:
> derjenige der das Programm geschrieben hat (also es war
> seine Bachelor-Arbeit) ist nicht mehr da.

Wenn es eine Bachelor-Arbeit ist, dann muß ja zu dem Programm eine 
ausführliche Beschreibung existieren, es sei denn, er hat nicht 
bestanden.

Aus der Beschreibung sollte hervorgehen, wie die Funktionen aufgerufen 
werden.
Einfach durch Hinschreiben wird eine Funktion jedenfalls nicht 
ausgeführt, sie ist nur toter Code.


Peter

von Merve B. (student1990)


Lesenswert?

Morgen,

ich habe das Programm auf einem anderen Rechner mit AVR 4 
gestartet(ursprünglich wurde es damit geschrieben). Da ging es dann 
plötzlich.
Also Breakpoint gesetzt, debuggen und dann auf "RUN", aber an was es 
jetzt gescheitert ist, kann ich euch nicht sagen.
Es war ein bisschen Glück.

Vielen Dank an alle!!!

von Thomas B. (nichtessbar)


Lesenswert?

War vermutlich ursprünglich ein AVR Studio 4 Projekt und du hast es in 
das Fünfer importiert bzw. konvertiert oder? Eventuell ist das was 
passiert dann...

von bla (Gast)


Lesenswert?

Sauger schrieb:
> Nabend,
>
>
>
> ohne main() geht es nicht. Durchsuche mal die Dateien im Projektordner,
>
> mit Windows Boardmitteln, auf die Zeichenkette "main". Wenn diese nicht
>
> zu finden ist hast du wohl nur Fragmente und kein Projekt bekommen.
>
>
>
> Ohne main() kann der Linker kein auf den Target ladbares Image erzeugen
>
> (sollte eine Fehlermeldung geben).
>
>
>
> Das was du API nennst ist ein header.
>
>
>
> MfG


Das ist falsch. Typischweise läuft vor einer "main" die crt0, in der 
gewisse Teile der Hardware initialisiert werden, und die dann zur "main" 
springt. Die "main" muss aber nicht so heissen. Dem gcc ist das 
vollkommen egal.

Und ein Programm fängt auch nicht immer bei Adresse 0 an zu laufen, das 
ist bei anderen Prozesoren auch anders. Ein MPC565 startet 
beispielsweise typischweise bei 0x100. Das wird über die 
Linker-Description-Files gesteuert, und die Adresse ist beliebig 
wählbar.

von Thomas B. (nichtessbar)


Lesenswert?

Wenn man den MPC565 verwendet arbeitet man aber üblicherweise nicht mit 
dem Atmel Studio oder?

von bla (Gast)


Lesenswert?

Thomas Bergmüller schrieb:
> Wenn man den MPC565 verwendet arbeitet man aber üblicherweise nicht mit dem 
Atmel Studio oder?


Natürlich nicht, wo habe ich das behauptet? Das war nur ein 
Gegenbeispiel zu "Der Code startet immer bei 0x0000".

von Merve B. (student1990)


Lesenswert?

@Thomas Bergmüller

Ja hab ich auch zuerst gedacht, aber anscheinend hat mein Rechner ein 
Problem mit AVR 4.
Also wenn ich (und meine Vorgänger) gedebuggt (keine Ahnung, ob man das 
so nennt :D ) haben, dann ist das ganze Programm abgestürzt.
Auf den anderen Rechnern ging es komischerweiße aber.
Deswegen wollte mein Prof. , dass ich es mit AVR 5 mache, damit ich 
"keine Probleme" bekomme.
Habe dann alles schön konvertiert, ging aber auch nicht. Was mir 
aufgefallen ist, dass ich kein "RUN" bei AVR 5 gefunden habe (bei AVR 4 
gab es ein extra Button für RUN). Vielleicht liegt es daran, was ich 
aber persönlich nicht denke.
Heute hab ich mal den ganzen Rechner platt gemacht und neuinstalliert, 
in der Hoffnung, dass es diesmal geht. War aber umsonst. Ich weiß leider 
nicht, was für ein Problem mein Rechner hat. Warum der jetzt so zickt.
Sobald ich weiß, was da los ist, werde ich es hier posten.
Vielleicht bringt es irgendjemandem mal was.
Ich denke, das ist auch ganz interessant zu wissen, an was es jetzt lag 
:)

Schönen Abend euch noch

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.