Was ich tue:Wie Funktionen in Headerdateien vortäuschen?
I cmocka bin mit Unit-Tests für großes eingebettetes Projekt auszuführen. Das eingebettete Projekt wird mit einem arm-gcc-compiler
kompiliert. Die Komponententests werden mit dem normalen gcc
unter Verwendung von Fragmenten des eingebetteten Codes und der cmocka-Bibliothek kompiliert. Normalerweise empfiehlt cmocka, das Flag -Wl,--wrap=functionName
zu verwenden, um einige nicht benötigte Unterfunktionen nachzuahmen (zu ersetzen). Das funktioniert ziemlich gut.
Das Problem:
Nun, in meinem eingebetteten Code gibt eine Header-Datei (foo.h
) ist, die einige Funktionen enthält (als inline deklariert). Eine dieser Funktionen enthält einige Assembler-Codes für die arm-gcc-compiler
, die natürlich nicht durch die gcc
kompiliert werden können.
Dummerweise scheint das wrap
-Flag nicht auf Funktionen zu funktionieren, die in Header-Dateien platziert werden.
Frage:
Wie diese Funktion in der Headerdatei weg verspotten?
Wie ich versuchte, das Problem zu lösen:
Ich dachte über einige #idef
Makros Einfügen des genannten Assembler Abschnitt auszuschließen. Dies ist jedoch nicht möglich, da diese Datei zu einer lizensierten Bibliothek gehört und ich ihren Inhalt nicht ändern darf.
Ich könnte meine Funktion unter Test in eine zusätzliche Dateien extrahieren, so dass foo.h
muss nicht mehr enthalten sein. Dies würde jedoch die Struktur der eingebetteten Quellcodes verwirren.
Exact Linien Problem
der genaue Code in portmacro.h von freeRtos an Leitung 233 gelegt wird:
portFORCE_INLINE static void vPortRaiseBASEPRI(void)
{
uint32_t ulNewBASEPRI;
__asm volatile
(
" mov %0, %1 \n" \
" msr basepri, %0 \n" \
" isb \n" \
" dsb \n" \
:"=r" (ulNewBASEPRI) : "i" (configMAX_SYSCALL_INTERRUPT_PRIORITY)
);
}
wo, wie portFORCE_INLINE
sind definiert als:
#define portFORCE_INLINE inline __attribute__((always_inline))
@LPs Aber wie? Linker hat keinen Zugriff auf den Quellcode und zu dem Zeitpunkt, zu dem der Linker läuft, wurde die Funktion bereits inline und stark optimiert. – yugr