我在做什么:
我正在使用 cmocka 为大型嵌入式项目运行单元测试。嵌入式项目使用arm-gcc-compiler
. gcc
单元测试使用嵌入式代码和 cmocka 库的正常使用片段进行编译。
通常 cmocka 建议使用-Wl,--wrap=functionName
标志来模拟(替换)一些不需要的子功能。这工作得很好。
问题:
好吧,在我的嵌入式代码中有一个头文件 ( foo.h
),其中包含一些函数(声明为内联)。其中一个函数包含 . 的一些汇编代码arm-gcc-compiler
,当然gcc
.
愚蠢的是,wrap
-flag 似乎不适用于放置在头文件中的函数。
问题:
如何在头文件中模拟这个函数?
我如何尝试解决问题:
我想过插入一些#idef
宏来排除提到的汇编器部分。但这无法做到,因为该文件属于许可库,并且我不允许更改其内容。
我可以将我的待测函数提取到一个附加文件中,这样foo.h
就不需要再包含它了。但这会混淆嵌入式源代码结构。
问题的确切线
确切的代码放在 freeRtos 的portmacro.h中的第 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 )
);
}
其中 asportFORCE_INLINE
定义为:
#define portFORCE_INLINE inline __attribute__(( always_inline))