我在做什么:
我正在使用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标志覆盖默认标头.