Что я делаю:Как имитировать функции в заголовочных файлах?
Я использую cmocka для запуска модульных тестов для большого вложенным проекта. Вложенный проект скомпилирован с arm-gcc-compiler
. Модульные тесты скомпилированы с нормальным gcc
с использованием фрагментов встроенного кода и библиотеки cmocka. Обычно cmocka рекомендует использовать флаг -Wl,--wrap=functionName
, чтобы высмеять (заменить) некоторые ненужные подфункции. Это работает очень хорошо.
Проблема:
Ну, в моем встроенном коде есть один файл заголовка (foo.h
), который содержит некоторые функции (объявлены как инлайн). Одна из этих функций содержит код ассемблера для arm-gcc-compiler
, который, конечно же, не может быть скомпилирован gcc
.
Глупо wrap
-flag, похоже, не работает над функциями, которые помещаются в заголовочные файлы.
Вопрос:
Как дразнить эту функцию в headerfile прочь?
Как я пытался решить проблему:
Я думал о вставке некоторых #idef
макросов, чтобы исключить раздел упомянутого ассемблере. Но это невозможно сделать, потому что этот файл принадлежит лицензированной библиотеке, и мне не разрешено изменять его содержимое.
Я мог бы извлечь мою функцию под тест в дополнительные файлы, так что foo.h
больше не нужно включать. Но это путало бы структуру встроенных исходных кодов.
Точные линии задачи
Точный код помещается в portmacro.h из freeRtos в строке 233:
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)
);
}
где, как portFORCE_INLINE
определяется как:
#define portFORCE_INLINE inline __attribute__((always_inline))
@LPs Но как? Linker не имеет доступа к исходному коду, а по истечении времени компоновщика ссылок функция уже была встроена и оптимизирована в значительной степени. – yugr