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!
> 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.
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?
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
> 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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.