Hallo, mich plagen sehr viele data aborts innerhalb des internen RAMs. Meinen Stack Ptr hab ich an der Adresse 0x00200798. Der interne RAM geht an sich bis zur Adresse 0x002FFFFF. Oberhalb des Stacks treten häufig data aborts auf. Leider weiß ich nicht genau welcher Prozess auf diesen Bereich zugreift. Der Heap und der Stack laufen doch irgendwann zusammen - d.h. oberhalb des Stack Pointers befindet sich doch eigenltich gar nichts, oder? Wenn ich versuche ein Pattern auf eine solche Addresse (z.b. 0x00205241) zu schreiben, bei der ein Data Abort erfolgt -> erhalte ich ebenfalls einen Data abort. Was könnte das Problem hierfür sein? Zwischen Heap und Stack hab ich ebenfalls schon mal ein paar Speicherzellen vollgeschrieben und dadurch überprüft ob Stack und Heap zusammenlaufen -> ist aber nicht der Fall. Laut Linkerfile befindet sich im internen RAM nur .ANY (+RW, +ZI) Bernd
Bernd Schuster wrote: > einen Data abort. Was könnte das Problem hierfür sein? Erstmal, daß keiner weiß, wovon Du redest (Architektur, CPU, OS, Compiler). Ich setz den Stack meistens auf 0xEF, 16 Byte reichen aus bei meinem 8051. Peter
darf ich auf den speicherbereich oberhalb des Stack Pointers überhaupt nicht zugreifen? Oder ist es legitim, dass ich dort ein Pattern reinschreibe. Ich meine der jetzige Data Abort passiert, weil ich da selbst über das Pattern versuche auf diese Address was zu schreiben. Nur warum darf ich das nicht? Bernd
arbeiten tue ich mit dem AT91RM9200 Controller, dessen interner RAM von 0x0020000 bis 0x002FFFFF liegt...
Bernd Schuster wrote: > Der Heap und der Stack laufen doch irgendwann zusammen - d.h. > oberhalb des Stack Pointers befindet sich doch eigenltich gar > nichts, oder? Ja und nein. Gibt beides. Es ist zwar ziemlich verbreitet, einen einzigen Stack vom oberen Rand des RAMs nach unten und den Heap andersrum dagegen laufen zu lassen, aber wetten würde ich nicht drauf. Schon garnicht bei ARMs, die oft mit einem separaten Interrupt-Stack arbeiten. In den üblichen Startup-Codes ist der dann nicht selten nur pro forma definiert, grad 4 Bytes gross, was eigentlich nur als Platzhalter für konkretere Angaben gedacht ist. Wer das vergisst... > Wenn ich versuche ein Pattern auf eine solche Addresse (z.b. 0x00205241) > zu schreiben, bei der ein Data Abort erfolgt -> erhalte ich ebenfalls > einen Data abort. Was könnte das Problem hierfür sein? Für solche Zwecke ist ein JTAG-Debugger recht hilfreich. Der kann dann nämlich einen Tip geben, wo genau das Problem auftrat. Geht aber auch anders, wenn der Abort-Handler das irgendwo mitteilt. Und wenn man Worte auf eine ungerade Adresse schreibt...
ich hab einen Abort Handler, der mit die genau Addr sagt von dem Data
Abort und ob es sich um einen Lese- oder Schreibzugriff handelte.
Der User-Stack ist bei mir 0x00000400, der IRQ stack ist 0x00000080 und
die anderen alle 0x00000008 (FIQ - hab ich keinen installiert, oder ABT,
Supervisor etc.). Das ganze Programm läuft auch im User-Mode.
Mein Stackptr zeigt auf jeden Fall zu Beginn auf die höchste Addr, die
sich aus der Summierung der verschiedenen Stacks ergibt. Beim Heap ist
die Adresse 0x00000000 eingetragen (sollte auch so stimmen, da es sonst
auch funktionierte und die Einstellung von Keil gekommen ist). Hab ich
auch in den anderen Bsp von Keil Projekten so gesehen.
D.h. der Speicherbereich über meinem Stack ist für alles frei
zugänglich?
>Und wenn man Worte auf eine ungerade Adresse schreibt...
Stichwort: Alignement - hab ich auch gerade gemerkt.. d.h. aber im
Umkehrschluss dass bei mir irgendwas auf genau so eine Addr zugreift.
Bernd
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.