2

我正在为一些嵌入式 C 编写单元测试,它们在主机上运行(尚未在目标上测试)并使用 GCC 编译。我一直在使用 Ceedling 构建系统和 Unity 测试框架进行测试。

我想测试的文件之一包括一个文件(比如 ah),其中包含另一个文件(比如 cpu.h),该文件是嵌入式设备供应商的板级支持包的一部分,并使用特定于目标编译器的关键字(例如__cregister,例如在extern __cregister volatile unsigned int IER;

另一个问题,同样是从 BSP 中包含的此类文件,是内联汇编asm()部分,例如#define FOO_ASM asm("FOO").

在构建测试时,这两者都会引发错误,因为 GCC 无法识别这些关键字。

我原以为我可以通过让 Ceedling 生成模拟、添加到我的测试文件来防止添加这些 BSP 标头#include "mock_a.h",但 GCC 仍然编译啊,因此 bh

是否有解决此类问题的最佳实践方法?

我可以在有问题的 BSP 文件中添加类似下面的内容,但我不愿意更改会更改或用新版本版本覆盖我的更改的供应商代码,我宁愿了解如何正确隔离该单元。

// Unknown how __cregister is initially defined
#ifdef TEST
    #undef __cregister // Redefine __cregister to nothing
    #define __cregister
#endif

extern __cregister volatile unsigned int IER;
4

1 回答 1

1

最后,我遵循了我对 OP 的评论中链接中概述的方法。

所以对于我原来的帖子的例子

/* foo.h */
extern __cregister volatile unsigned int IER;
#define FOO_BAR_ASM asm("BAR");

我在目录中创建了以下同名文件,并test/support/从测试构建设置中删除了真实 BSP 文件的包含路径:

/*foo.h - in test/support */
extern volatile unsigned int IER;
#define FOO_BAR_ASM

#include "mock_foo.h"然后在测试文件中添加了一个包含之类的内容。

于 2017-01-18T12:18:42.553 回答