Mein Vorgehen:
- Projekt in IDE Deiner Wahl erzeugen, alle Dateien des Zielsystems
einbinden, ausser der main.c
- eigene main.c erstellen, welche den Code aus cunit aufnimmt
Jetzt erst mal alle Compiler-Fehler beseitigen. Das Problem mit den
Ports und Registern des Zielsystems (HC11) habe ich so gelöst:
Da bereits eine Struktur TS_RegsHC11 in der Datei „hc11f_r.h“ existiert,
brauchte ich nichts weiter zu tun, als an geeigneter Stelle im Testcode
eine globale Instanz zu erzeugen:
Nun kann man die HW-Register beliebig beschreiben oder lesen, z.B.:
1 | PPROG = PPROG | 0x16;
|
2 | printf("\n _PPROG = %d\n", RegsHC11.U_PPROG. _PPROG);
|
Dank entsprechender Makros sind auch folgende Varianten möglich:
1 | RegsHC11.U_PORTG._PORTG = InvState[InvStateIdx];
|
2 | PORTG = InvState[InvStateIdx];
|
3 | G_PortG = InvState[InvStateIdx];
|
Wahrscheinlich wirst Du nicht umhinkommen, und gewisse Funktionen
mittels bedingter Compileranweisung für den Test zu deaktivieren, bzw.
durch eine spezielle Testfunktion zu ersetzen. Beispielsweise wenn Du
Rückmeldungen der HW simulieren willst, wie z.B. ein Eingabegerät mit
Tasten.
Nehmen wir an, du möchtest die Fuktion ZeigeInfo() testen. Das
Zielsystem pollt mit er Funktion GetKey() auf einen Tastendruck:
main UI HwDriver
¦ ZeigeInfo() ¦ ¦
¦-------------->¦ GetKey() ¦
¦ ¦----------->¦
¦ ¦ Key N ¦
¦ ¦<-----------¦
¦ ¦ GetKey() ¦
¦ ¦----------->¦
¦ ¦ Key Exit ¦
¦ ¦<-----------¦
¦<--------------¦ ¦
Nun erstellst Du im TestCode eine eigene Funktion GetKey() mit der
gleichen Signatur wie das Original, welche bei jedem Aufruf, abhängig
von einem globalen Test-Status G_TestIdx, den gewünschten Key
zurückliefert:
1 | unsigned char GetKey()
|
2 | {
|
3 | unsigned char Key=0;
|
4 |
|
5 | switch (G_TestIdx)
|
6 | {
|
7 | case 0:
|
8 | case 1:
|
9 | case 3:
|
10 | case 4:
|
11 | case 11:
|
12 | // führe hier geeignete Tests durch
|
13 | // CU_ASSERT_xxx
|
14 | Key = K_DOWN; // liefere den simulierten Tastendruck
|
15 | G_TestIdx++; // nächster Test-Index
|
16 | break;
|
17 | case 9:
|
18 | // führe hier geeignete Tests durch
|
19 | // CU_ASSERT_xxx
|
20 | Key = K_LEFT; // liefere den simulierten Tastendruck
|
21 | G_TestIdx++; // nächster Test-Index
|
22 | break;
|
23 | case 13:
|
24 | // führe hier geeignete Tests durch
|
25 | // CU_ASSERT_xxx
|
26 | Key = K_EXIT; // genug jetzt
|
27 | G_TestIdx++; // nächster Test-Index
|
28 | break;
|
29 | default:
|
30 | // führe hier geeignete Tests durch
|
31 | // CU_ASSERT_xxx
|
32 | G_TestIdx++; // nächster Test-Index
|
33 | break;
|
34 | }
|
35 | return Key;
|
36 | }
|
Die Originalfunktion muss leider mittels bedingter Kompilation
stillgelegt werden und kann nicht getestet werden.
1 | #ifndef GCC_CUNIT_TEST_COMPILATION
|
2 | unsigned char GetKey()
|
Im Testcode zu ZeigeInfo() brauchst Du die Variable TestIdx richtig zu
setzen und rufst ZeigeInfo() auf, welche die obigen Tests durchfürt und
durch den simulierten ExitKey wieder zurückkommt.