嵌入式单元测试的模拟错误“重载函数的地址与所需类型不匹配 'void()'

Error in mocking for embedded unit testing "Address of overloaded function does not match required type 'void()'

我正在开发一个嵌入式 C 项目,目前正在为其编写单元测试。我正在使用 fff 模拟框架,它实质上创建了虚假的函数调用,这些调用应该使硬件特定的调用过载。

当我创建 'fake function' 时,我收到一条错误消息,指出

Address of overloaded function does not match required type 'void()'

每次我尝试创建假货时都会发生这种情况。我主要是一名嵌入式 C 程序员,并且仅将 C++ 元素用于单元测试。我真的不明白这条消息告诉我什么或者为什么它是一个问题。如果有人能提供任何见解,我将不胜感激。

有问题的代码如下所示。该错误在函数名称上突出显示:xTaskCreate、HAL_TIM_Base_Init 和 HAL_TIM_ConfigClockSource.

#include <TinyEmbeddedTest.h>
#include <stdio.h>
#include "stm32f1xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
#include "fff.h"

#include "heater.c"  //source file being tested

DEFINE_FFF_GLOBALS;

FAKE_VALUE_FUNC(BaseType_t, xTaskCreate, TaskFunction_t, char *, configSTACK_DEPTH_TYPE, void *, UBaseType_t, TaskHandle_t *);
FAKE_VALUE_FUNC(HAL_StatusTypeDef, HAL_TIM_Base_Init, TIM_HandleTypeDef);
FAKE_VALUE_FUNC(HAL_StatusTypeDef, HAL_TIM_ConfigClockSource, TIM_HandleTypeDef, TIM_ClockConfigTypeDef*);

由于您的错误与重载有关,这意味着您正试图对同一函数使用多个定义。 我建议您确保这些模拟声明(也是定义)不会重新定义有问题的函数的原始定义。 因此,例如,如果您正在模拟一个函数 int func(void),那么您不能只添加一个模拟声明 FAKE_VALUE_FUNC(int,func)。 您需要在原始函数实现之前添加 weak 属性,或者用函数指针替换原始函数实现。 您可以在我之前就类似问题给出的两个答案中更广泛地阅读更多相关信息: