Applikation haengt am Return

Gast #3163431
Lesenswert?

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 #3163563
Lesenswert?

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
#3163574
Lesenswert?

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 #3163594
Lesenswert?

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 #3163644
Lesenswert?

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 #3163743
Lesenswert?

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.

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