Forum: Compiler & IDEs XC32 Statische Stack Analyse


von Little B. (lil-b)


Lesenswert?

Hallo zusammen!

Zusammenfassung: Ich habe ein Static Stack Analyzer für den XC32 von 
Microchip geschrieben, veröffentlicht unter GPLv3 und zu finden hier:

https://github.com/SentinelSw/MipsStaticStackAnalyzer


Hintergrundgeschichte:

Im Rahmen eines Automotive Projekts wird ein PIC32MZ eingesetzt, der mit 
Hilfe der Microchip Toolchain programmiert wird.

Da wir ASIL-B erreichen müssen, haben wir unter Anderem die Anforderung, 
unseren Speicherverbrauch zu messen. Für Flash und statischen RAM ist 
das kein Problem, denn der Microchip Linker gibt diese Zahlen im Mapfile 
an. Für den dynamischen RAM Verbrauch auf dem Stack gibt es jedoch keine 
Information.

Da der Microchip XC32 auf GCC basiert, haben wir beschlossen, 
-fstack-usage zu verwenden. Nach Rückfrage bei Microchip gab es jedoch 
die Auskunft, dass dieses Feature offiziell nicht unterstützt wird und 
davon abgeraten wird, es zu verwenden.

Ja, aber wie können wir denn dann unseren Stack Verbrauch bestimmen?
Nach langem Hin und Her mit Microchip die Aussage: Statisch schon mal 
gar nicht. Weder der Compiler kann das, noch gibt es 3rd-Party-tools. 
Messe es doch einfach zur Laufzeit!

Ein kleiner Hinweis dazu: Eine Stack Überwachung zur Laufzeit ersetzt 
eine Statische Stack Analyse NICHT. Im Gegenteil, ohne zu wissen, 
wieviel Stack die Applikation braucht, macht eine Überwachung gar keinen 
Sinn. Am Ende muss man beides machen, um die Applikation abzusichern.

Intern sprach man von nun an von einem Projektgefährdenden Risiko.

Nach wochenlanger Diskussion kam das Thema schlussendlich auf meinen 
Tisch, ich solle das doch mal dynamisch messen. Stattdessen habe ich 
mich dazu entschieden, es doch lieber statisch zu ermitteln. Daraus 
entstand das oben verlinkte Programm.

Mit Rücksprache meines Auftraggebers durfte ich dieses Programm unter 
GPLv3 veröffentlichen. So können andere Projekte von diesem Wissen 
profitieren und sind nicht auf die Gnade von Microchip angewiesen, und 
verlieren nicht so viel Zeit wie wir es getan haben.

Bug tracking auf Github, features werden wohl keine hinzugefügt.


Mit freundlichen Grüßen
Florian Kaup
Sentinel Software GmbH


PS: We're hiring!

von oerks (Gast)


Lesenswert?

> Sentinel Software GmbH

Ich habe hier noch einen violetten Sentinel Super Pro.
Wie kann ich herausbekommen wofuer der gut ist/war?

Leider habe ich fuer MIPS nur den C32 am Start.
Mal schaun wie sich deine Software da so macht.

von oerks (Gast)


Lesenswert?

1
x:\test>tcc -v
2
tcc version 0.9.27 (x86_64 Windows)
3
4
x:\test>tcc -o staticStackAnalyzer.exe staticStackAnalyzer.c
5
6
x:\test>staticStackAnalyzer.exe -n99 out.elf > out.txt
7
8
...
9
10
11
|Name                                              |Own            |Deepest        |Indirect Calls |
12
|--------------------------------------------------|---------------|---------------|---------------|
13
|cmd_files                                         |4664           |7368           |               |
14
|cmd_read                                          |1800           |4488           |               |
15
|cmd_owRead                                        |1768           |4464           |               |
16
|cmd_owWrite                                       |1752           |4448           |               |
17
|cmd_line                                          |1160           |4176           |               |
18
|fun_owCRC16                                       |1232           |3928           |               |
19
|cmd_font                                          |1224           |3928           |               |
20
|fun_owCRC8                                        |976            |3672           |               |
21
|cmd_input                                         |968            |3664           |               |
22
|cmd_circle                                        |880            |3576           |               |
23
|cmd_owSearch                                      |768            |3464           |               |
24
|cmd_term                                          |360            |3448           |               |
25
|cmd_print                                         |728            |3424           |               |
26
|cmd_open                                          |336            |3424           |               |
27
|cmd_write                                         |720            |3416           |               |
28
|cmd_i2cReceive                                    |720            |3416           |               |
29
|cmd_i2cSlaveSend                                  |720            |3416           |               |
30
|cmd_i2cSend                                       |712            |3408           |               |
31
|cmd_on                                            |704            |3400           |               |
32
|cmd_close                                         |704            |3400           |               |
33
|_main_entry                                       |0              |3320           |               |
34
|main                                              |232            |3320           |               |
35
|getcoord                                          |584            |3280           |               |
36
|cmd_pixel                                         |576            |3272           |               |
37
|cmd_preset                                        |576            |3272           |               |
38
|cmd_pset                                          |576            |3272           |               |
39
|cmd_loadbmp                                       |448            |3152           |               |
40
|cmd_name                                          |448            |3152           |               |
41
|cmd_if                                            |416            |3112           |*              |
42
|cmd_renumber                                      |400            |3096           |               |
43
|SerialOpen                                        |392            |3088           |               |
44
|cmd_dim                                           |704            |3080           |               |
45
|fun_spi                                           |376            |3072           |               |
46
|cmd_for                                           |376            |3064           |               |
47
|cmd_shiftin                                       |368            |3064           |               |
48
|cmd_i2cSlaveReceive                               |360            |3056           |               |
49
|cmd_i2cSlaveEnable                                |360            |3056           |               |
50
|cmd_shiftout                                      |352            |3048           |               |
51
|cmd_num2byte                                      |360            |3048           |               |
52
|cmd_time                                          |344            |3048           |               |
53
|fun_instr                                         |344            |3040           |               |
54
|cmd_date                                          |336            |3040           |               |
55
|cmd_delete                                        |336            |3032           |               |
56
|cmd_setpin                                        |336            |3032           |               |
57
|fun_mid                                           |336            |3032           |               |
58
|fun_byte2num                                      |336            |3032           |               |
59
|cmd_xmodem                                        |328            |3032           |               |
60
|cmd_poke                                          |328            |3024           |               |
61
|cmd_list                                          |328            |3024           |               |
62
|cmd_owReset                                       |328            |3024           |               |
63
|fun_inputstr                                      |328            |3024           |               |
64
|fun_format                                        |320            |3024           |               |
65
|cmd_i2cEnable                                     |328            |3024           |               |
66
|cmd_sound                                         |328            |3024           |               |
67
|cmd_lineinput                                     |320            |3016           |               |
68
|fun_left                                          |320            |3016           |               |
69
|fun_right                                         |320            |3016           |               |
70
|fun_string                                        |320            |3016           |               |
71
|fun_peek                                          |320            |3016           |               |
72
|cmd_settick                                       |320            |3016           |               |
73
|cmd_auto                                          |312            |3008           |               |
74
|cmd_locate                                        |312            |3008           |               |
75
|fun_pixel                                         |312            |3008           |               |
76
|fun_loc                                           |296            |2992           |               |
77
|fun_lof                                           |296            |2992           |               |
78
|fun_eof                                           |296            |2992           |               |
79
|cmd_next                                          |568            |2944           |               |
80
|cmd_fse                                           |88             |2792           |               |
81
|fun_pin                                           |96             |2792           |               |
82
|cmd_rmdir                                         |80             |2784           |               |
83
|cmd_mkdir                                         |80             |2784           |               |
84
|cmd_savebmp                                       |72             |2776           |               |
85
|cmd_load                                          |40             |2744           |               |
86
|cmd_run                                           |40             |2744           |               |
87
|cmd_kill                                          |40             |2744           |               |
88
|cmd_help                                          |40             |2744           |               |
89
|cmd_option                                        |32             |2736           |               |
90
|cmd_save                                          |32             |2736           |               |
91
|cmd_do                                            |40             |2728           |               |
92
|cmd_loop                                          |40             |2728           |               |
93
|cmd_error                                         |24             |2728           |               |
94
|cmd_merge                                         |24             |2728           |               |
95
|cmd_pin                                           |32             |2728           |               |
96
|cmd_drive                                         |24             |2728           |               |
97
|cmd_chdir                                         |24             |2728           |               |
98
|fun_val                                           |24             |2728           |               |
99
|fun_space                                         |32             |2728           |               |
100
|fun_ucase                                         |40             |2728           |               |
101
|fun_lcase                                         |40             |2728           |               |
102
|fun_tab                                           |32             |2728           |               |
103
|cmd_pause                                         |40             |2728           |               |
104
|cmd_mmss                                          |24             |2720           |               |
105
|cmd_let                                           |32             |2720           |               |
106
|cmd_goto                                          |24             |2720           |               |
107
|cmd_gosub                                         |24             |2720           |               |
108
|cmd_edit                                          |24             |2720           |               |
109
|fun_chr                                           |24             |2720           |               |
110
|fun_cint                                          |24             |2720           |               |
111
|fun_hex                                           |24             |2720           |               |
112
  done

Ist das so plausibel?

von Little B. (lil-b)


Lesenswert?

Ich kenne deinen Calltree nicht, mich wundert, dass main und _main_entry 
nicht ganz oben stehen. Ich vermute, dass du mit cmd_if mittels function 
pointer die "großen" funktionen rufst?

Die Formatierung sieht gut aus. Die Stack Usage kannst nur du 
einschätzen.

Sollte da etwas eklatant schief gegangen sein, schaue ich mir gerne mal 
dein beispiel an.

Danke für das Feedback soweit!

Florian Kaup

von oerks (Gast)


Lesenswert?

> kenne deinen Calltree nicht

Da das ganze ein Basicinterpreter ist, kenne ich den zur Gaenze
auch nicht :-).
(Duinomite Basic 2.70d, erweitert um einige eigene Kommandos.)

Der gcc (aus dem C32) war der hier:
gcc version 3.4.4 Microchip MPLAB C Compiler for PIC32 MCUs 
v1.11(b)-20100809

Aber zumindest decken sich die Angaben mit eigenen Beobachtungen
am laufenden Code.

von Olaf (Gast)


Lesenswert?

> Da wir ASIL-B erreichen müssen
[..]
> Da der Microchip XC32 auf GCC basiert,

Wer hat den eigentlich euren Compiler zertifiziert damit er cool, 
richtig und fehlerfrei arbeitet?

Olaf

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.