Forum: Compiler & IDEs CUnit auf avr portieren - Problem mit snprintf


von Stefan (Gast)



Lesenswert?

Hallo, versuche gerade CUnit (http://cunit.sourceforge.net/ )auf den avr 
zu portieren.

Änderungen waren nötig, einmal Compilerflags, um inline Assembler in der 
avr-libc zu akzeptieren, zum anderen mussten manche Funktionen raus - da 
in der avr-libc nicht vorhanden.
Im Anhang sind meine beiden Patches.
Dann bauen mit:

rm configure
autoconf
./configure --host=avr --disable-automated --disable-console
make

Funktioniert auch, leider nicht vollständig.
Es wird für alle Tests, die nicht durchlaufen, auch korrekt die Zeile 
angezeigt.

Allerdings fehlt am Ende die Zusammenfassung.
Sie müsste so aussehen:

--Run Summary: Type      Total     Ran  Passed  Failed
               suites        1       1     n/a       0
               tests         1       1       0       1
               asserts       2       2       0       2


Probiere ich den selben Code auf x86, funktioniert das auch.

Beim Debuggen sieht man, dass er auch in CU_get_run_results_string(void) 
in TestRun.c ankommt, jedoch scheitert die Geschichte am snprintf.
In result steht allerdings ziemlicher Quatsch, kein wirklicher ASCII 
String.
In snprintf zu debuggen ist sehr schwer, da es doch sehr low-level mäßig 
ist mit vielen Makros und unübersichtlichen Kontrollstrukturen.

snprintf funktioniert ansich auch, auch mit doubles und auch mit %8.3f 
ähnlichen Formatierungen.

Nicht nur die Zusammenfassung fehlt auf dem avr, sondern auch noch 
andere Ausgaben:
1
     CUnit - A unit testing framework for C - Version 
2
2.1-2
3
     http://cunit.sourceforge.net/
4
5
6
    1. src/main.c:147  - CU_ASSERT_TRUE(false())
7
    2. src/main.c:148  - CU_ASSERT_TRUE(0)
1
     CUnit - A Unit testing framework for C - Version 2.1-0
2
     http://cunit.sourceforge.net/
3
4
Suite: Test
5
  Test: Hoffentlich klappts
6
 ... FAILED
7
    1. ../src/cunittest.c:27  - CU_ASSERT_TRUE(false())
8
    2. ../src/cunittest.c:28  - CU_ASSERT_TRUE(0)
9
10
--Run Summary: Type      Total     Ran  Passed  Failed
11
               suites        1       1     n/a       0
12
               tests         1       1       0       1
13
               asserts       2       2       0       2

An der Länge des Summarystrings liegt es wohl auch nicht.

Danke schonmal für alle Tipps

von Stefan (Gast)


Lesenswert?

Die anderen Ausgaben kommen nun mit, es lag bloß an unterschiedlichen 
Compilerflags für CUnit und main.c.

Ich vermute mal, dass der Speicher voll läuft.
Wahrscheinlich uA durch die Strings in CUnit, die ja prinzipiell erstmal 
alle in den Ram geladen werden.

Sobald man 1,7kB zusätzlich belegt, schmiert das Programm ab.
Belegt man 1,5kB, gibt er sogar einen Fehler aus, die Resultate könnten 
nicht ausgegeben werden.

von StinkyWinky (Gast)


Lesenswert?

Ich bin mir nicht sicher, ob sich der Aufwand der Portierung 
längerfristig lohnt.

Würdest Du nicht besser den Code auf dem PC kompilierfähig machen und 
die CUnit-Tests dort laufen lassen? Dann hättest Du keine Probleme, 
beliebig viele Unit-Tests zu implementieren.

Die Simulation der HW muss dabei nicht perfekt sein. Man kommt schon 
sehr weit, wenn nur schon die Register simuliert geschrieben/gelesen 
werden können.

von Laser Phew Phew (Gast)


Lesenswert?

Es hat sich definitiv gelohnt.
Lieber einmal ein fertiges Programm portieren als jedes einzelne 
teilweise auf nem Rechner zu kompilieren.

Statt dem Ram ist eine fehlende Funktion des avr-gccs verantwortlich 
gewesen:

printf() etc unterstützen hier nicht die Angabe der mindestens 
auszugebenen Zeichen als Argument, man muss das also im Formatstring 
direkt angeben:

"%20s", "ein String" statt "%*s" , 20, "ein String"

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.