Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Hardfault fehler suche (stm32F407)


von Ersi (cell85)


Angehängte Dateien:

Lesenswert?

Hi,

ich hab einen code aus matlab generiert und erhalte einen hardfault der 
mir nichts sagt (siehe bild).
Ich kann mir denken das es etwas damit zu tun hat das ich single, double 
variablen benutze und irgendwie der arm damit nich klar kommt. FPU 
funktioniert (dank anderem thread hier im forum).

Kann mir jemand mal auf die Sprünge helfen?

Hier ensteht der Fehler:
1
main.c:
2
.
3
.
4
.
5
static boolean_T Shutdown_signal_data[10]; /* Shutdown vector <- Neu! */ 
6
static int32_T Shutdown_signal_size[2]; /* the size of the Shutdown */
7
8
static real32_T data_cut [640]; /*Data cut*/
9
static real32_T ref_cut [640]; /*Data cut*/
10
static real32_T Toleranz = 15; //Toleranz
11
12
13
Algo_10Frames(data_cut, ref_cut, Toleranz, Shutdown_signal_data, Shutdown_signal_size);
14
15
16
.
17
.
18
.
19
algo.c:
20
.
21
.
22
.
23
24
/* Function Definitions */
25
void Algo_10Frames(const real32_T data[640], const real32_T ref[640],
26
                      real32_T vToleranz_percent, boolean_T
27
                      Shutdown_signal_data[10], int32_T Shutdown_signal_size[2])
28
{
29
real_T y_data[640];
30
real_T ydata_data[640];
31
int32_T iy;
32
int32_T theta_size[2];
33
int32_T theta_data_size[2];
34
real_T theta_data[256];
35
real_T theta_data_data[256];
36
real_T ydata_ueber_og_data[64];
37
real_T ydata_unter_ug_data[64];
38
real_T jetzt_abschalten_data[640];
39
emxArray_real_T *r0;
40
int32_T i;
41
real_T b_y_data[10];
42
int32_T ymodell_size[2];
43
int32_T i2;
44
int32_T ymodell_data_size[2];
45
int32_T pix;
46
real_T ymodell_data[800];
47
real_T ymodell_data_data[800];
48
real32_T Toleranz;
49
real32_T y_p10_data[800];
50
real32_T y_m10_data[800];
51
  int32_T i1;
52
  boolean_T exitg1;
53
54
  /*  Current Parameters: 5px above tolerance anywhere, 20% for Shutdown signal = 1 */
55
56
  for (iy = 0; iy < 640; iy++) {
57
    y_data[iy] = 0.0;
58
    ydata_data[iy] = 0.0;
59
  }
60
61
  theta_size[0] = 4;
62
  theta_size[1] = 64;
63
  theta_data_size[0] = 4;
64
  theta_data_size[1] = 64;
65
  for (iy = 0; iy < 256; iy++) {
66
    theta_data[iy] = 0.0;
67
    theta_data_data[iy] = 0.0;
68
  }
69
  
70
Delay(1);
71
  
72
  
73
  for (iy = 0; iy < 64; iy++) {
74
    ydata_ueber_og_data[iy] = 0.0;
75
    ydata_unter_ug_data[iy] = 0.0;
76
  }
77
78
  memset(&jetzt_abschalten_data[0], 0, 640U * sizeof(real_T));
79
80
.
81
.
82
.
83
.
84
.


der fehler ensteht beim ersten durchlauf von der for schleife:
1
for (iy = 0; iy < 640; iy++) {
2
    y_data[iy] = 0.0;
3
    ydata_data[iy] = 0.0;
4
  }

Reicht der Speicher vielleicht nich aus ?
Ich werd mal alles auf double stellen und nicht single und double 
mischen.

Laut Keil nachm kompilieren:

Program Size: Code=39636 RO-data=816 RW-data=464 ZI-data=21104

Gruß
E

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

> Reicht der Speicher vielleicht nich aus ?

Können wir mit dem Codeschnipsel alleine nicht sagen, aber der braucht 
reichlich Speicherplatz auf dem Stack. Rechne Dir selbst mal aus 
wieviel.

von Dr. Sommer (Gast)


Lesenswert?

Schau doch mal ins Manual bevor du fragst. Such im ARMv7M Architecture 
Reference Manual nach dem Error bit "STKERR".
Dann startest du das Programm mit Debugger und siehst dir die genaue 
Stelle an bei der der Fehler auftritt, insbesondere die jeweilige 
Instruktion, und findest raus auf was die zugreift und das somit den 
Fehler verursacht hat.

von Ersi (cell85)


Lesenswert?

lieber dr. sommer

  STKERR  Stacking from exception has caused one or more bus faults. The 
SP is still adjusted and the values in the context area on the stack 
might be incorrect. The BFAR is not written.


aber wenn ic hdiese for schleife in der main ausführe ist es ok.
nur sobald ich diesen innerhalb der funktion ausführe ist es fehlerhaft.
ich kann mir nich vorstellen das soooo viel in der funktion auf den 
stack geschmissen wird, das es einen stack err gibt.

von ozo (Gast)


Lesenswert?

Naja, der ganze Kram hier landet doch auf dem Stack:

real_T y_data[640];
real_T ydata_data[640];
int32_T iy;
int32_T theta_size[2];
int32_T theta_data_size[2];
real_T theta_data[256];
real_T theta_data_data[256];
real_T ydata_ueber_og_data[64];
real_T ydata_unter_ug_data[64];
real_T jetzt_abschalten_data[640];
emxArray_real_T *r0;
int32_T i;
real_T b_y_data[10];
int32_T ymodell_size[2];
int32_T i2;
int32_T ymodell_data_size[2];
int32_T pix;
real_T ymodell_data[800];
real_T ymodell_data_data[800];
real32_T Toleranz;
real32_T y_p10_data[800];
real32_T y_m10_data[800];
int32_T i1;
boolean_T exitg1;

Grüße

von Dr. Sommer (Gast)


Lesenswert?

Ersan G. schrieb:
> STKERR  Stacking from exception has caused one or more bus faults. The
> SP is still adjusted and the values in the context area on the stack
> might be incorrect. The BFAR is not written.
Wo hast du das denn her, das steht in meinem ARMv7M Architecture Manual 
nicht drin.

Ersan G. schrieb:
> aber wenn ic hdiese for schleife in der main ausführe ist es ok.
> nur sobald ich diesen innerhalb der funktion ausführe ist es fehlerhaft.
Kann ja sein dass dein Stack so voll ist dass der Funktionsaufruf das 
Fass zum überlaufen bringt...

von Ersi (cell85)


Angehängte Dateien:

Lesenswert?

ich hab das von der arm seite her.
Hab in Matlab jetzt noch eingestellt das er für cortex m4 optimiert 
arbeiten soll. Jetzt gibts den fehler. Wo soll ich denn nach was suchen 
?

Ist DF0138B0 die Speicheradresse??

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Das ist jetzt ein anderer Fehler. Scheint die Adresse zu sein, die sieht 
nicht sonderlich gültig aus. Verwende einen Debugger.

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
Noch kein Account? Hier anmelden.