Zur Prüfung der Funktionsüberdeckung von einem Program braucht man ja nur am Funktionsanfang einen Zähler inkrementieren und beim Terminieren vom Programm nur die Zähler mit den Funktionsnamen ausgedruckt. Das müsste sich weitgehend automatisieren lassen, denn über _FUCTION_ bekommt man ja den Funktionsnamen. Aber ich konnte noch nichts (Präprozessor-Makro o. ä.) finden das die Gesamtzahl der Funktionen eines Programms berechnet und auch nichts das jeder Funktion einen Index (für ein Datenfeld mit den Aufruf-Zählern, eines für die Funktionsnamen) zuweist. Gibt es das (noch) nicht?
Dafür gibt's Tools wie gcov. https://en.wikipedia.org/wiki/Gcov https://gcc.gnu.org/onlinedocs/gcc/Gcov.html
Wilhelm M. schrieb: > Dazu gibt es: > > https://gcc.gnu.org/onlinedocs/gcc/Gcov.html Das hilft mir nicht weiter, weil es ein Anwendungs-Programm ist und das scheidet bei einer freestanding implementation aus.
Ob Freestanding Mode oder Hosted Mode ist doch erstmal egal. Oder was ist das Problem mit Freestanding Mode?
Johann L. schrieb: > Ob Freestanding Mode oder Hosted Mode ist doch erstmal egal. Nein, auf einem kleinen Mikrocontroller hat man kein Betriebssystem, auf dem Gcov laufen könnte.
Man kann gcov auch auf einem uC ans laufen bekommen. Ging ein paar Informationen dazu im Netz. Aber evtl. reicht auch schon -finstrument-functions Die Hooks muss man halt implementieren. https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ https://github.com/reeteshranjan/libgcov-embedded https://mcuoneclipse.com/2014/12/26/code-coverage-for-embedded-target-with-eclipse-gcc-and-gcov/ Matthias
Erwin M. schrieb: > Johann L. schrieb: >> Ob Freestanding Mode oder Hosted Mode ist doch erstmal egal. > > Nein, auf einem kleinen Mikrocontroller hat man kein Betriebssystem, auf > dem Gcov laufen könnte. Das hat aber nicht mit Freestanding C oder Hosted C zu tun. Cross-Entwicklung also. Sag das doch gleich. AUF dem µC läuft ja auch kein gcov, sondern instumentierter Code generiert Daten FÜR gcov. gcov läuft auf deinem Host. Instrumentierung setzt eine gewisse Mindest-Umgebung voraus aber kein OS. problem kann sein, dass die zu erzeugenden Daten nicht ins RAM passen oder der größere Code nicht mehr in den µC. Da solchen keine Beschränkungen genannt wurden also kein Problem. Um die Daten aus dem µC zu bekommen brauchst du entweder eine echte Schnittstelle / Virtualisierung von xprintf oder ein System das das von Hause aus unterstützt wie ein Simulator. Es gibt auch Hersteller dir minimal-invasives Profiling anbieten, frag einfach mal deinen Toolchain-Support.
Johann L. schrieb: > > AUF dem µC läuft ja auch kein gcov, sondern instumentierter Code > generiert Daten FÜR gcov. gcov läuft auf deinem Host. Es soll ohne Host sein; für ein bischen inkrementieren und ein paar Werte ausgeben einen Host zu verwenden ist doch mit Kanonen auf Spatzen zu schießen. Da reichen ein Paar Code-Zeilen.
:
Bearbeitet durch User
Erwin M. schrieb: > Es soll ohne Host sein; [...] Da reichen ein Paar Code-Zeilen. Ungewöhnlich. Insbesondere für eine Beitrag in "PC-Programmierung". Üblicherweise wird ja nur während der Entwicklung instrumentiert, z.B. für Profiling oder zur Zertifizierung. Im Feld will man wegen des Overheads i.d.R. keinen instrumentierten Code mehr haben. Erwin M. schrieb: > Gibt es das (noch) nicht? Nein, dein Anwendungsfall ist ziemlich speziell. Auf Präprozessor-Ebene kann's da auch nix geben weil der nur Textersetz macht (Translation Phase 1-4). Funktionen sind ein Konzept von Phase 7 (Compilation) bzw. Phase 8 (Linkage). Von dem was du suchst wird nichts im C-Standard erwähnt.
:
Bearbeitet durch User
MaWin schrieb: > -finstrument-functions Ja, sowas in der Art, danke für den Tipp. Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen macht und sie auch nicht zählt. Das muss man also manuell machen. Ich brauche ja nur am Funktionsanfang sowas wie: if (0 == funktionszaehler[i_funktionsnummer++]) funktionsname[i_funktionsnumer]="__FUNCTION__"; und daneben beispielsweise vom Singal-Handler ein Ausdrucken der Zählerwerte mit den Funktionsnamen daneben.
:
Bearbeitet durch User
Erwin M. schrieb: > Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen > macht und sie auch nicht zählt. > Das muss man also manuell machen. Ja dann nimm halt einen Profiler. Meine Güte. Du willst einen lecker Schinken, aber kein Schwein töten. Erwin M. schrieb: > Ich brauche ja nur am Funktionsanfang sowas wie: Dann implementiere das. Lösungen wurden genannt.
Erwin M. schrieb: > MaWin schrieb: >> -finstrument-functions > > Ja, sowas in der Art, danke für den Tipp. > Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen > macht und sie auch nicht zählt. > Das muss man also manuell machen. > > Ich brauche ja nur am Funktionsanfang sowas wie: > > if (0 == funktionszaehler[i_funktionsnummer++]) > funktionsname[i_funktionsnumer]="__FUNCTION__"; > > und daneben beispielsweise vom Singal-Handler ein Ausdrucken der > Zählerwerte mit den Funktionsnamen daneben. Gehts eigentlich um C? Oder dürfen es auch C++-Pattern sein?
Wilhelm M. schrieb: > Erwin M. schrieb: > brauche ja nur am Funktionsanfang sowas wie: >> >> if (0 == funktionszaehler[i_funktionsnummer++]) >> funktionsname[i_funktionsnumer]="__FUNCTION__"; >> >> und daneben beispielsweise vom Singal-Handler ein Ausdrucken der >> Zählerwerte mit den Funktionsnamen daneben. > > Gehts eigentlich um C? Oder dürfen es auch C++-Pattern sein? Ja, C, meistens mit GCC compiliert, so das auch die GCC-Erweiterungen verwendet werden können.
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.