Applikation haengt am Return

Gast #3163431
Hi

ich benutze Keil uvison 4 und dort den debuger. Ich habe folgendes 
Problem:

Bei einigen Funktionen haengt sich mein programm auf. Was ich im 
Debugger sehe ist, dass er Program-Pointer immer an der selben Stelle 
haengt und nicht zurueckspringt aus der Funktion. Woran koennte sowas 
liegen?

Im dissembley steht:

  1490:    return(0);
0x08003F10 2A01      CMP      r2,#0x01
0x08003F12 DA01      BGE      0x08003F18
0x08003F14 2000      MOVS     r0,#0x00
  1491: }
  1492:
...
..


danach passiert aber nix mehr.
Gast
es ist relativ viel code :(..

viel mehr wuerde mich interessieren woran es liegen KANN und wie ich das 
am besten "erforschen" kann. Glaube nicht, dass mir hier jemand direkt 
sagen kann woran es genau liegt.

folgendes kann ich aber noch sagen.

Ich habe einen Bootloader der bei 0x08000000 bis 0x08003000 liegt.

Mein projekt startet ab 0x08003000.. ich springe vom bootloader in die 
main meines programs. Ein einfaches programm laeuft auch ganz normal 
(z.b. endlos while mit paar additionen).

Benutze ich ein komplexes projekt haengt es an einigen Funktionen die 
relativ am anfang sind. Wenn ich eine Funktion auskommentiere an der es 
haengt.. haengt es an einer weiteren. Es sind alles return Funktionen.

koennte das etwas mit Interrupts zu tun haben?

Wichtig waere fuer mich einfach eine Moeglichkeit das zu debugen
Andi schrieb:
> es ist relativ viel code :(..
>
> viel mehr wuerde mich interessieren woran es liegen KANN

indem man zum Beispiel irgendwo den Stack niedergebügelt hat. Zum 
Beispiel mit Array-Zugriffen, die ausserhalb des erlaubten Bereichs 
liegen. Zum Beispiel mit String Operationen, die wieder ausserhalb des 
zugewiesenen Speichers irgendwelche Bytes verändern.


> koennte das etwas mit Interrupts zu tun haben?

möglich ist alles. Wenn du tatsächlich irgendwo den Stack zerschossen 
hast, kann man überhaupt nichts mehr ausschliessen. Die eigentliche 
Ursache muss noch nicht mal in der Nähe der bewussten Funktion bzw. des 
return sein.
Gast
Den Stack zerschossen habe ich glaub ich nicht. Die Applikationen laufen 
ohne Bootloader ganz normal durch (evtl ein wichtiges Detail).

Es sieht manchmal so aus als ob der PC einfach irgendwo haengt.... wie 
kann er sich einfach so festbeissen? Er springt nicht herum.. laeuft 
eigentlich immer ganz genau den Programmcode ab nur irgendwann bleibt er 
einfach stehen.
Gast
Wenn hier gesagt wurde: Den Stack zerschossen, bedeutet das, dass der 
Stackpointer das einzige ist was noch stimmt. Der Inhalt ist hinüber und 
das ist ganz normales RAM.
Wenn z.B. eine Unterfunktion beendet wird und die Heimatadresse nicht 
mehr stimmt, so ist das Programm recht gutgläubig in nimmt das was da 
ist. Und tschüss.
Gast
So langsam denke ich.. es liegt am stackpointer.

hab noch bei den Fault Reports (auf die haette man mich hinweisen 
muessen :-)) einen Hacken bei Memory Manage Faults:

"IACCVIOL" =  instruction access violation der direkt auftritt wenn ich 
in vom bootloader in die main springe.

Der Stckpointer haengt dann, wenn bei Busfaults folgende Hacken gesetzt 
sind:

PRECISERR
IMPRECISERR
STKERR


Erklaerung zu den Fehlern.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihcfefj.html

Nun muss ich wohl scheinbar rausfinden warum der Prozessor diese Flags 
setzt.

Meine Scatter files:

Von der eigentlichen App:
LR_IROM1 0x08003000 0x0001D000  {    ; load region size_region
  ER_IROM1 0x08003000 0x0001D000  {  ; load address = execution address
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

Vom Bootloader:

LR_IROM1 0x08000000 0x00003000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00003000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

Koennte mir vorstellen, dass hier irgendwas nicht stimmt.
Gast
Ach ja.. hat echt mit dem Scatterfile zu tun.. hab nun:

   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)


bei beiden eingefuegt .. nun klappt alles wunderbar.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.