首页 > 解决方案 > 模拟嵌入式单元测试时出错“重载函数的地址与所需的类型‘void()’不匹配

问题描述

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

当我创建一个“假函数”时,我收到一条错误消息,指出

重载函数的地址与所需类型“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*);

标签: c++cunit-testingmockingfake-function-framework

解决方案


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

  1. https://stackoverflow.com/a/65814588/4441211
  2. https://stackoverflow.com/a/65814339/4441211

推荐阅读