eclipse - 如何在 Eclipse CDT 中实现模块化硬件单元测试?
问题描述
我使用嵌入式系统,我正在做裸机编程。对于我的目标微控制器,制造商建议使用 C 或 C++ 编写代码,并使用他们定制的 Eclipse 版本来编译代码、对芯片进行编程和调试。
作为开发技术,我正在尝试使用TDD,因此我在编写模块的同时为该模块创建单元测试。
而且,由于嵌入式系统的性质,我将测试分为两个不同的组:
- 软件单元测试:在这些测试中,我创建软件模拟或伪造品来模拟所有硬件访问。这样,我可以使用任何我想要的测试框架在 PC 上运行测试。这些测试工作正常。
- 硬件单元测试:在这些测试中,我检查我是否真的了解制造商提供的用于进行硬件访问的库和/或我检查我是否可以正确控制我板上的硬件。这些测试需要在目标处理器中运行,所以我需要在 Eclipse 中编译。<--在这里我遇到了问题。
为了编写与硬件交互的第一个模块,我创建了一个新的 eclipse 项目,专门用于编译相应的硬件单元测试。在这个新项目中,我创建了指向模块所需文件夹的链接,从构建与模块无关的代码中排除,然后我创建了一个新文件,然后main()
按预期运行测试。那很好。
为了实现第二个模块,我做了与第一个模块相同的操作,并且测试也按预期运行。但是,在实施第二个模块后,第一个项目停止编译。
第一个项目的问题出现了,因为 Eclipse 在共享目录中检测到一个新的源文件(在第二个模块中使用),试图编译这个入侵源文件,然后由于依赖错误而崩溃。
由于 Eclipse 似乎编译了目录中的所有内容,并且为了推进我的开发,我需要继续在共享目录中插入文件,我不知道如何继续实现这些模块化硬件测试,而无需为每个新模块重新进行先前的测试。有人知道吗?
问题示例
下面我展示了一个简化的问题示例,因为有些模块已经在没有单元测试的情况下实现了。
第一个模块:SPI
当我完成 SPI 模块时,文件是:
my_project
├── src/
│ ├── config/
│ │ ├── config_clk.c
│ │ ├── config_spi.c
│ │ └── config_spi.h
│ └── hal/
│ └── spi/
│ ├── spi.c
│ └── spi.h
└── test/
└── spi/ (Location of the SPI test project)
├── .cproject
├── .project
├── test_spi_custom_config_clk.c
└── test_spi_main.cpp
我创建了一个新项目,创建了指向文件夹的链接src/hal/spi
,src/config
并排除了该文件src/config/config_clk.c
,并且运行良好。
第二个模块:EEPROM
当我完成 EEPROM 模块时,文件是:
my_project
├── src/
│ ├── config/
│ │ ├── config_clk.c
│ │ ├── config_eeprom.c
│ │ ├── config_eeprom.h
│ │ ├── config_spi.c
│ │ └── config_spi.h
│ └── hal/
│ ├── eeprom/
│ │ ├── eeprom.c
│ │ └── eeprom.h
│ └── spi/
│ ├── spi.c
│ └── spi.h
└── test/
├── eeprom/ (Location of the EEPROM test project)
│ ├── .cproject
│ ├── .project
├── test_eeprom_custom_config_eeprom.c
│ └── test_eeprom_main.cpp
└── spi/ (Location of the SPI test project)
├── .cproject
├── .project
├── test_spi_custom_config_clk.c
└── test_spi_main.cpp
我创建了一个新项目,创建了指向文件夹src/hal/eeprom
和的链接src/config
,排除了文件src/config/config_clk.c
,src/config/config_spi.c
并且运行良好。
但是,当我尝试运行第一个测试时,Eclipse 尝试编译src/config/config_eeprom.c
并中断,因为 config_eeprom.c 依赖于 eeprom.h 或其他东西。
所以很明显,这不是一种可持续的方法。
解决方案
推荐阅读
- python - 使用python搜索应该出现在另一个字符串中的单词开头的单词
- c# - 将视频转换为 .bin 用于全息 3D 风扇
- c# - 来自同一台机器的 UWP 服务器应用程序连接失败并显示 127.0.0.1
- dart - 如何处理在 Flutter 中搜索大型列表?
- linux - qemu-system-arm -redir 无效选项
- ajax - 无法使用 DRF API 上的 AJAX 调用设置 cookie
- java - 父级“EVENT”的事件类型“ADD_SENSOR”已存在
- php - 使用 twitter API 填充数组
- matomo - Matomo 遇到错误:调用未定义函数 Davaxi\Sparkline\mb_strlen() (导致:Zend_Session 当前标记为只读。)
- php - Code Igniter Flashdata 在重定向后并不总是保持值