mikrocontroller.net

Forum: Compiler & IDEs XC32 Statische Stack Analyse


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Little B. (lil-b)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

x:\test>tcc -v
tcc version 0.9.27 (x86_64 Windows)

x:\test>tcc -o staticStackAnalyzer.exe staticStackAnalyzer.c

x:\test>staticStackAnalyzer.exe -n99 out.elf > out.txt

...


|Name                                              |Own            |Deepest        |Indirect Calls |
|--------------------------------------------------|---------------|---------------|---------------|
|cmd_files                                         |4664           |7368           |               |
|cmd_read                                          |1800           |4488           |               |
|cmd_owRead                                        |1768           |4464           |               |
|cmd_owWrite                                       |1752           |4448           |               |
|cmd_line                                          |1160           |4176           |               |
|fun_owCRC16                                       |1232           |3928           |               |
|cmd_font                                          |1224           |3928           |               |
|fun_owCRC8                                        |976            |3672           |               |
|cmd_input                                         |968            |3664           |               |
|cmd_circle                                        |880            |3576           |               |
|cmd_owSearch                                      |768            |3464           |               |
|cmd_term                                          |360            |3448           |               |
|cmd_print                                         |728            |3424           |               |
|cmd_open                                          |336            |3424           |               |
|cmd_write                                         |720            |3416           |               |
|cmd_i2cReceive                                    |720            |3416           |               |
|cmd_i2cSlaveSend                                  |720            |3416           |               |
|cmd_i2cSend                                       |712            |3408           |               |
|cmd_on                                            |704            |3400           |               |
|cmd_close                                         |704            |3400           |               |
|_main_entry                                       |0              |3320           |               |
|main                                              |232            |3320           |               |
|getcoord                                          |584            |3280           |               |
|cmd_pixel                                         |576            |3272           |               |
|cmd_preset                                        |576            |3272           |               |
|cmd_pset                                          |576            |3272           |               |
|cmd_loadbmp                                       |448            |3152           |               |
|cmd_name                                          |448            |3152           |               |
|cmd_if                                            |416            |3112           |*              |
|cmd_renumber                                      |400            |3096           |               |
|SerialOpen                                        |392            |3088           |               |
|cmd_dim                                           |704            |3080           |               |
|fun_spi                                           |376            |3072           |               |
|cmd_for                                           |376            |3064           |               |
|cmd_shiftin                                       |368            |3064           |               |
|cmd_i2cSlaveReceive                               |360            |3056           |               |
|cmd_i2cSlaveEnable                                |360            |3056           |               |
|cmd_shiftout                                      |352            |3048           |               |
|cmd_num2byte                                      |360            |3048           |               |
|cmd_time                                          |344            |3048           |               |
|fun_instr                                         |344            |3040           |               |
|cmd_date                                          |336            |3040           |               |
|cmd_delete                                        |336            |3032           |               |
|cmd_setpin                                        |336            |3032           |               |
|fun_mid                                           |336            |3032           |               |
|fun_byte2num                                      |336            |3032           |               |
|cmd_xmodem                                        |328            |3032           |               |
|cmd_poke                                          |328            |3024           |               |
|cmd_list                                          |328            |3024           |               |
|cmd_owReset                                       |328            |3024           |               |
|fun_inputstr                                      |328            |3024           |               |
|fun_format                                        |320            |3024           |               |
|cmd_i2cEnable                                     |328            |3024           |               |
|cmd_sound                                         |328            |3024           |               |
|cmd_lineinput                                     |320            |3016           |               |
|fun_left                                          |320            |3016           |               |
|fun_right                                         |320            |3016           |               |
|fun_string                                        |320            |3016           |               |
|fun_peek                                          |320            |3016           |               |
|cmd_settick                                       |320            |3016           |               |
|cmd_auto                                          |312            |3008           |               |
|cmd_locate                                        |312            |3008           |               |
|fun_pixel                                         |312            |3008           |               |
|fun_loc                                           |296            |2992           |               |
|fun_lof                                           |296            |2992           |               |
|fun_eof                                           |296            |2992           |               |
|cmd_next                                          |568            |2944           |               |
|cmd_fse                                           |88             |2792           |               |
|fun_pin                                           |96             |2792           |               |
|cmd_rmdir                                         |80             |2784           |               |
|cmd_mkdir                                         |80             |2784           |               |
|cmd_savebmp                                       |72             |2776           |               |
|cmd_load                                          |40             |2744           |               |
|cmd_run                                           |40             |2744           |               |
|cmd_kill                                          |40             |2744           |               |
|cmd_help                                          |40             |2744           |               |
|cmd_option                                        |32             |2736           |               |
|cmd_save                                          |32             |2736           |               |
|cmd_do                                            |40             |2728           |               |
|cmd_loop                                          |40             |2728           |               |
|cmd_error                                         |24             |2728           |               |
|cmd_merge                                         |24             |2728           |               |
|cmd_pin                                           |32             |2728           |               |
|cmd_drive                                         |24             |2728           |               |
|cmd_chdir                                         |24             |2728           |               |
|fun_val                                           |24             |2728           |               |
|fun_space                                         |32             |2728           |               |
|fun_ucase                                         |40             |2728           |               |
|fun_lcase                                         |40             |2728           |               |
|fun_tab                                           |32             |2728           |               |
|cmd_pause                                         |40             |2728           |               |
|cmd_mmss                                          |24             |2720           |               |
|cmd_let                                           |32             |2720           |               |
|cmd_goto                                          |24             |2720           |               |
|cmd_gosub                                         |24             |2720           |               |
|cmd_edit                                          |24             |2720           |               |
|fun_chr                                           |24             |2720           |               |
|fun_cint                                          |24             |2720           |               |
|fun_hex                                           |24             |2720           |               |
  done


Ist das so plausibel?

von Little B. (lil-b)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.