Hallo,
vorab: Bitte keine Ratschläge diesen Error zu debuggen mittels Assembler
Routinen usw. Ich verstehe davon nur Bahnhof und kann es doch nicht
ändern, wenn da im tiefsten Inneren etwas schief läuft.
Es geht einfach nur darum den Stack in das CCCRAM zu legen, was ich
intuitiv so gemacht habe im Linker Script:
1 | .stack_dummy (NOLOAD):
|
2 | {
|
3 | *(.stack)
|
4 | } > CCRAM
|
5 |
|
6 | /* Set stack top to end of RAM, and stack limit move down by
|
7 | * size of stack_dummy section */
|
8 | __StackTop = ORIGIN(CCRAM) + LENGTH(CCRAM);
|
9 | __StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
10 | PROVIDE(__stack = __StackTop);
|
11 |
|
12 | /* Check if data + heap + stack exceeds RAM limit */
|
13 | /*ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") */
|
Der Debugger zeigt dann auch, dass das sp register sich korekt bei
0x1000FFFF befindet, also im CCRAM.
Nun ist es so, dass das komplexe Programm dann abschmiert und zwar bei
einer sprintf Funktion, nachdem es zuvor zig davon abgearbeitet hat. Die
Stelle ist eigentlich völlig unbedeutend, da passiert nichts weiter.
Das CCRAM ist 64k gross, ich habe nichts drin ausser dem Stack, das
müsste also reichen.
Kurz bevor der Hard Fault Handler angesprungen wird sieht es so aus bei
mir.
Da sieht noch alles normal aus, der Step über sprintf aber ist der
letzte, der ausgeführt wird :-( Setze ich den PC drüber hinweg springt
er eben beim nächsten Mal sprintf da rein.
sprintf ist eine Funktion der libs, ich nutze die nano-branch, habe die
Linker Option -lm gesetzt für float Ausgabe in printf und auch die Flags
diese Funktionen aus der Nano-Branch zu nehmen.
Nutze ich die default lib stürzt er zwar nicht ab, aber alle float
printf Ausgaben sind "leer".
Was ist da strubbelig?
Gruss,
Christian