Ich arbeite auf einem ARM Cordex M4 Controller und habe folgendes
Problem:
Ich möchte im Hardfault_Handler() eine Fehlerursache in einer Variable
speichern, dessen Inhalt nach dem Softwarereset noch erhalten sein soll.
Der SoftwareReset passiert am Ende des Hardfault.
Folgendes kleines Beispielprojekt:
1 | int32_t ulErrSave __attribute__((section(".no_init.ulErrSave"))); ///< über ein SoftwareReset hinweg retten.
|
2 |
|
3 | int main(void)
|
4 | {
|
5 | // Es soll einmal, nach dem ersten Start, ein Hardfault ausgelöst werden.
|
6 | if(ulErrSave != 2)
|
7 | {
|
8 | // Hardfault auslösen
|
9 | (*((volatile uint32_t *)(0x100))) = 0x1234567;
|
10 | }
|
11 | while(1)
|
12 | {
|
13 | // Juhu er läuft
|
14 | }
|
15 | return 0;
|
16 | }
|
17 |
|
18 | extern int32_t ulErrSave; ///< über ein SoftwareReset hinweg retten.
|
19 | uint32_t Test;
|
20 | void HardFault_Handler(void)
|
21 | {
|
22 |
|
23 | ulErrSave = 2;
|
24 | // Test = ulErrSave; //<--- Wenn ich diese Zeile einbaue funktioniert es!
|
25 |
|
26 | if(SCB->HFSR & SCB_HFSR_DEBUGEVT_Msk)
|
27 | {
|
28 | // Debugging related hard fault
|
29 | FAULT_TRAP();
|
30 | }
|
31 | .......
|
32 | NVIC_SystemReset();
|
33 | while(1);
|
34 | }
|
Wenn ich das ganze jetzt mit dem Debugger teste, sehe ich das die
Variable ulErrSave beim Start erstmal nicht inisiliert ist. Wenn dann
der Hardfault_Handler() aufgerufen wird, wird sie gesetzt. Nach dem
Reset steht dann wieder der Ursprüngliche Wert drin. (nicht 0! sie wird
nicht initislisiert).
Es sieht erstmal so aus als wenn der Wert nicht ins RAM geschrieben
wird.
Wenn ich die Variable ulErrSave jetzt nach dem beschreiben nochmal lese
(siehe im Quelltext) dann funktioniert es.
Ich habe den Assemblercode zwischen beiden Varianten verglichen und kann
an der Speicherstelle kein unterschied feststellen. Beides:
1 | 0x0000032E 4B 14 LDR R3,[PC,#0x50]
|
2 | 0x00000330 22 02 MOV R2,#0x2
|
3 | 0x00000332 60 1A STR R2,[R3,#0x0]
|
Auch mit der Data Memory Barriere (DMB) habe ich schon rumgespielt. Ohne
Erfolg.
Hat jemand eine Idee was dort passiert?