我正在寻求智者的帮助。:-) 这不是关于测试本身的技术帮助,而是更多的代码组织问题。我正在使用 libopencm3 HAL 和 ceedling 作为测试套件的 STM32 项目。
我将问题保持简短并仅引用一小部分来证明这一点,显然代码中还有其他此类模块。
深入研究这个问题,主函数调用了一个函数“Init”,该函数存在于它自己的模块“Init”中。Init 从 IO 模块调用几个函数——IOInit 和 IOBlink,它们初始化 GPIO 并以特定模式闪烁 GPIO。
IOInit和IOBlink的形式如下
IOInit(GPIO)
IOBlink(PATTERN)
其中 GPIO 和 PATTERN 分别是 STATUS_LEDS、POWERUP 之类的东西,可以是枚举或 #define,具体取决于我选择构建它们的方式。
所以第一个问题就在这里,在这里定义IOInit 和IOBlink 的参数有什么意义?如果我想要一些在这里冗长但稍后在较低级别的函数调用中得到解决的参数?我将如何定义论点?作为 uint8_t,枚举,#define?
所以他们可以看起来像
IOInit(GPIO)
{
//Something like this
if (GPIO == STATUS_LED)
{
InitIO(STATUS_LED_PORT, OUTPUT, STATUS_LED);
}
else (GPIO == MODE_IO)
{
//Do something else..
}
...
}
IOBlink(PATTERN)
{
if (PATTERN == POWERUP)
{
//GPIOToggle(Pin, delay, repetitions)
GPIOToggle(STATUS_LED, 500, 4);
}
else if (PATTERN == ERROR)
// Do something else
}
现在,IOInit 和 IOBlink 在位于 HAL 顶部的“DriverIO”模块中调用它们的较低级别的函数。DriverIO 具有相应的功能 - InitIO 和 GPIOToggle,它们可能看起来像这样
InitIO(PORT, Mode, Pins)
{
rcc_periph_clock_enable(PORT);
gpio_set_mode(PORT, GPIO_MODE_OUTPUT_2_MHZ, Mode, Pins);
//Need to find a way to resolve PORT, Mode and Pins into a HAL compatible format
}
GPIOToggle(Pin, delay, repetitions)
{
for (uint8_t i = 0; i<= repetitions, i++)
{
gpio_toggle(STATUS_LED_PORT, Pin);
delay_ms(delay);
}
}
现在有一些明显的明显的事情我认为可以而且应该改进。
所有三个层,Init、IO 和 DriverIO 都需要一个公共包含,其中包含 STATUS_LED_PORT 和 STATUS_LED 的定义 - 这闻起来很糟糕。这个想法是让每一层更加模块化和自包含,如果我必须在所有三层中包含 BSP.h 或类似的东西,这将失败。
2a. DriverIO 无法模拟和测试 - 因为它位于 HAL 之上。- 解决这个问题的一种方法,从我在这里读到并且可以理解的是添加一个“垫片层”或一个“包装器”,它基本上位于 DriverIO 和 HAL 之间,我可以简单地将标题包含在“包装器”中DriverIO,模拟包装器并测试 DriverIO。
2b。垫片层还有另一个问题。低级 HAL 使用 typedef 枚举作为参数,垫片层和上述层将无法访问这些参数。那么 shim 层中的翻译函数会是什么样子?
例如 - libopenCM3 HAL 中的时钟启用功能如下所示
void rcc_periph_clock_enable(enum rcc_periph_clken clken);
在垫片层中它会是什么样子?考虑到 DriverIO 不会知道枚举 rcc_periph_clken 的样子?
整体架构在设计时感觉还不错。但在实施过程中它真的崩溃了。原则上,main 只调用状态函数,每个状态函数只调用存在大量控制逻辑的中间层函数,中间层调用位于 HAL 上的驱动层函数。我为这篇冗长的帖子道歉,但我在设计和架构阶段花了很多时间来做这件事,我无法直截了当地思考。我患有一些分析麻痹。这可能是一个非常简单的解决方案,但我无法直接看到它。
再次,如果我没有多大意义,我深表歉意。我已经盯着这个看了好几天了,我认为它对其他人没有多大意义(如果有的话)。我试图让它可以理解,但这可能只是我缺乏梦话。请让我知道是否有特定部分我可以以更好的方式解释并说清楚。
真诚感谢任何帮助。