如何在headerfiles中模拟函数?

我在做什么:

我正在使用cmocka来运行大型嵌入式项目的单元测试.
嵌入式项目使用arm-gcc-compiler编译.
使用嵌入代码的片段和cmocka库,使用普通gcc编译单元测试.
通常cmocka建议使用-Wl, – wrap = functionName标志来模拟(替换)一些不需要的子函数.这非常好用.

问题:

好吧,在我的嵌入式代码中有一个头文件(foo.h),它包含一些函数(声明为内联).其中一个函数包含arm-gcc-compiler的一些汇编代码,当然,它不能由gcc编译.

愚蠢的是,wrap-flag似乎不适用于放在头文件中的函数.

题:

如何在头文件中模拟这个函数?

我是如何尝试解决问题的:

我想插入一些#idef宏来排除提到的汇编程序部分.但是这不可能,因为该文件属于许可库,我不允许更改其内容.

我可以将我的测试功能提取到另外的文件中,这样就不再需要包含foo.h了.但这会混淆嵌入式源代码结构.

确切的问题

确切的代码放在freeRtos第233行的portmacro.h中:

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))

最佳答案

Stupidly the wrap-flag seems not to work on functions
which are placed in header files.

这不是换行的错,函数已被编译器内联,因此链接器无法做到.

How to mock this function in the headerfile away?

一种选择是使用sed在将其传递给gcc之前自动修补有问题的代码.例如.改变

portFORCE_INLINE static void vPortRaiseBASEPRI( void )
{
  uint32_t ulNewBASEPRI;
  ...
}

portFORCE_INLINE static void vPortRaiseBASEPRI_2( void )
{
  uint32_t ulNewBASEPRI;
  ...
}

从你的例子到

portFORCE_INLINE static void vPortRaiseBASEPRI( void );

portFORCE_INLINE static void vPortRaiseBASEPRI_2( void );

cat tmp.c | sed '/inline\|INLINE/,/^}$/{ s/^\(.*\(inline\|INLINE\).*\)/\1;/; /inline\|INLINE/!d }'

正则表达式非常草率,它依赖于标题中的所有定义都将具有INLINE标记但在您的情况下应该足够的事实.

您可以将上面的命令嵌入到Makefile中,以在temp文件夹中生成自定义标头,然后使用-Ipath / to / temp / folder标志覆盖默认标头.

点赞