Forum: Mikrocontroller und Digitale Elektronik Mehr Code funktioniert nicht. ARM7


von Peter P. (axis)


Angehängte Dateien:

Lesenswert?

Hallo NG,

jetzt habe ich es hinbekommen, dass mein Display (HD44780) initialisiert 
wird. Nachdem die Funktionen für Kommandos und Datensenden ans Display 
die gleichen sind, mit der Ausnahme, dass RS LOW oder HIGH ist, habe ich 
mir gedacht, das Ganze einfach zu kopieren. Ich arbeite komplett mit 
Sub-Routinen. Leider funktioniert mein Code nicht mehr, auch wenn ich 
die neue Funktion ganz ans Ende schreibe. Es wird zwar alles Assembliert 
(ohne Fehler) aber sobalt ichs auf den AT91SAM7S256 übertrage 
funktioniert es nicht mehr, obwohl ich den Code (am Ende) ja noch nicht 
mal "anspringe".

Was kann denn das sein?

Ich habe mal meinen Quelltext, so wie er funktioniert angehängt. Sobalt 
ich allerdings ein paar Zeilen hinzufüge geht nichts mehr...

Bin für jeden Tip dankbar!
Peter

PS.: die Wartezeiten sind für meine Versuchszwecke gerade sehr hoch 
eingestellt!

von mthomas (Gast)


Lesenswert?

Wie ist die Stack-Initialisierung implementiert?

von Obelix X. (obelix)


Lesenswert?

Was sagt denn dein Debugger?

von peter pippinger (Gast)


Lesenswert?

@mthomas
Ich habe keinen Stack definiert. Brauche ich denn unbedingt einen? Habe 
bisher noch keinen Bedarf gehabt. Sind im Code denn Befehle, die einen 
Stack voraussetzen?

@Obelix
Ich habe open-ocd am laufen. Mich verwundert nur, warum der Code so wie 
er ist funktioniert und das Display initialisiert wird. Nur wenn ich 
zusätzlichen Code am Ende anfüge geht gar nichts mehr, obwohl der Code 
ja nicht mal benützt wird :-( Wie würdest Du vorgehen, um den Fehler zu 
finden?

von Peter P. (axis)


Lesenswert?

Hallo NG,

also ich weiß nicht, ob ich mich falsch ausgedrückt habe. Aber: Ich habe 
ein Problem. Es klappt jetzt eigentlich alles, bis auf dass ich meinen 
Code nicht erweitern kann.

Der Code, so wie er ist läuft. Aber sobald ich auch nur ein paar neue 
"waits" am Ende einbaue läuft der Teil am Anfang, der ja jetzt schon 
läuft, leider nicht mehr...

Kann mir nicht jemand einen Tip geben? Ich finde echt nichts, woran das 
liegt... Speicher sollte ja noch en mass vorhanden sein (binfile ist so 
um die 360 Bytes)...

von Frank (Gast)


Lesenswert?

Wenn openOCD läuft, kannst du doch schon single-steppen, oder hab ich 
das falsch in Erinnerung? Mit halt-after-reset o.ä. kann man direkt am 
Anfang der Codeausführung stehen bleiben und dann Schritt für Schritt 
schauen, was passiert. Ich persönlich würde dir auch zu gdb/ddd/insight 
in Kombination mit openOCD raten. Hat bei mir immer gut funktioniert.

von Peter P. (axis)


Lesenswert?

Könnte mir vielleicht jemand ein "Template" für die IAR Workbench geben, 
mit dem ich meine 64KB Code passend für den AT91SAM7S256 assemblieren 
kann?

von Seven-of-Nine (Gast)


Lesenswert?

Tun die Borgs nicht assemblieren ? ;-)

Ach ne - sie assimilieren

Lang lebe das Kollektiv

von Peter P. (axis)


Angehängte Dateien:

Lesenswert?

Hallo NG,

ich bekomme es einfach nicht zum Laufen :-(

Jetzt habe ich mal einen map-File erzeugen lassen. Vielleicht kann mit 
ja jemand sagen, ob da was nicht stimmt...

Als xcl verwende ich die at91SAM7S256_RAM.xcl, aus den Examples.

Das Binary lade ich dann via Samba nach 0x200000.

Mit go 200000 starte ich dann das Programm. Jedoch funktioniert das 
nicht mehr, wenn der Code >ca.400 Byte ist.

Ein kleiner Tip würde mich sehr freuen.
Peter

von Frank (Gast)


Lesenswert?

Err, kann sein, dass du teile von samba überschreibst, die im ram 
liegen. Nimm openocd, wo du es doch eh schon am laufen hast.

von Peter P. (axis)


Lesenswert?

@Frank:
ist es definitiv so, dass Teile von SAM-BA im SRAM liegen? Wenn ja, wo 
liegen die denn?

MfG
Peter

von Greg (Gast)


Lesenswert?

Hallo Peter,

ich weiß nicht mehr wo ich es las, aber seit ich meine SRAM-Programme 
auf Adresse 0x202000 lege, habe ich mit SAM-BA keine Probleme.

Gruß,
Greg.

von Peter Pippinger (Gast)


Lesenswert?

@Greg
danke für Deinen Hinweis. Reicht es, wenn ich einfach die Binary in 
SAM-BA nach 0x202000 lade und mit go 0x202000 starte, oder muss ich dazu 
im Linker oder sonstwo noch etwas beachten?

von Frank (Gast)


Lesenswert?

Nachdem man mit SAMBA das komplette flash beschreiben kann, müss es 
zwangsweise im ram liegen. Die "Lösung", dein Programm einfach weiter 
hinten ins ram zu laden, mag kurzfristig funktionieren, tut es aber 
garantiert nicht auf Dauer. Größere Programme -> absolute Adressierung. 
Oder meinetwegen auch Interrupts und deren feste Position am Anfang des 
Adressraums.
Ohne das böse zu meinen: Deine Probleme sind hausgemacht. SAMBA ist für 
die Tonne oder erste Tests nach der Inbetriebnahme. Nimm openOCD (gerne 
mit gdb/ddd oder Insight) und gut. Das funktioniert 1a und kostet mich 
nur ein make all debug, bzw make all program debug, wenn es im flash 
landen soll. Integration in beliebige IDEs sollte sich machen lassen, 
mein Favourit ist aber immer noch der VI(M).

von Peter P. (axis)


Lesenswert?

Hey Kinder! Ihr seid spitze! Vielen Dank!

@Greg
an 202000 funktionierts ohne Probleme...

@frank
Ich würde es auch gerne mit openOCD machen. Aber mein Rechner ist 
einfach zu weit weg vom ARM :-( Irgendwann, wenn ich mal ne eigene 
Bastelecke habe, werde ichs so machen!

Danke nochmal an alle!

von Frank (Gast)


Lesenswert?

>Aber mein Rechner ist einfach zu weit weg vom ARM :-(

Muss man das verstehen? Mit SAMBA brauchst doch auch ein USB-Kabel. 
Damit könnte man auch ein USB-JTAG interface betreiben.
Auch mit meinem Wiggler klappt das selbst über 1 m Flachbandkabel 
langsam aber problemlos. Glaub mir, du wirst es nicht bereuen. :)

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.