c++ - 模拟嵌入式单元测试时出错“重载函数的地址与所需的类型‘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*);
解决方案
由于您的错误与重载有关,这意味着您正在尝试对同一个函数使用多个定义。我建议您确保这些模拟声明(也是定义)不会重新定义有问题的函数的原始定义。例如,如果你在模拟一个函数,int func(void)
那么你不能只添加一个模拟声明FAKE_VALUE_FUNC(int,func)
。您需要weak
在原始函数实现之前添加属性,或者用函数指针替换原始函数实现。您可以在我之前就类似问题给出的两个答案中更广泛地阅读有关它的更多信息:
推荐阅读
- asp.net-web-api - 从 Autofac AsWebApiAuthenticationFilterFor 中排除特定方法
- java - 安全停止线程
- operator-overloading - Eclipse Xtend:覆盖 equals() 与 operator_equals()
- vb.net - 将两个 DataTable 列中的值合并到一个新列中
- xquery - 基于条件的Xquery变量concat
- fancytree - Fancytree 根据条件启用/禁用复选框
- java - 为什么 JavaFX 包含重复的颜色常量?
- c++ - 将共享库的搜索路径更改为 Makefile 中提供的 rpath
- node.js - 如何从 docker 容器中获取主机信息(CPU 利用率)?
- scala - while 循环和递归所花费的时间