在gTest中模拟FreeRTOS函数

时间:2018-02-07 09:07:54

标签: c++ c mocking googletest freertos

对于一个项目,我在嵌入式系统上用c ++实现了一个通过 FreeRTOS队列获取传感器数据的组件,并将它们处理成 FreeRTOS任务

因为HW尚未到达&质量原因(TDD),我想模拟freeRTOS功能并使用它们来模拟我的组件行为。

我提前感谢你。

2 个答案:

答案 0 :(得分:2)

所以我设法通过结合网站上的不同答案来解决我的问题:How to use google test for C++ to run through combinations of data& Can gmock be used for stubbing C functions?

我的回答有点大,但如果你想使用它,你可以简单地使用copy&过去。

在我的测试文件夹中模拟freeRTOS元素:
FreeRTOS_mock.hpp

"hallo","hello","foo" -replace 'l','L'

<强> FreeRTOS_mock.cpp

/* Include freeRTOS headers */
#include "FreeRTOS.h"
#include "queue.h"
#include "task.h"

/* Include gTest mockup functionality */
#include "gmock/gmock.h"

/* Mock all functions needed from FreeRTOS */
namespace freertos {

class FreeRTOSInterface
{
public:
    virtual ~FreeRTOSInterface() {}

    virtual QueueHandle_t xQueueGenericCreate(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType) = 0;
    /* define other freeRTOS elements the same way */
};

class FreeRTOSMock : public FreeRTOSInterface
{
public:
    virtual ~FreeRTOSMock() {}

    MOCK_METHOD3(xQueueGenericCreate, QueueHandle_t(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType));
    /* Align with what was defined above */
};

} /* namespace freertos */

<强> TestSuiteXXX_unittest.cpp

#include "FreeRTOS_mock.hpp"

freertos::FreeRTOSMock FreeRTOSMockObj;

QueueHandle_t xQueueGenericCreate(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType)
{
    return FreeRTOSMockObj.xQueueGenericCreate(uxQueueLength, uxItemSize, ucQueueType);
}

/* Align with what is in the .hpp */

同样重要的是,您必须在 makefile 中定义了有效的#include "FreeRTOS_mock.hpp" extern freertos::FreeRTOSMock FreeRTOSMockObj; /* Write my TCs by using the FreeRTOS functions*/

FreeRTOSConfig.h

模拟感官数据:
TestSuiteXXX_unittest.cpp

INCLUDE_DIRS = \
        -I$(FREERTOS_DIR)/Source/include \
        -I$(FREERTOS_DIR)/Source/portable/GCC/ARM_CM4F \
        -I$(PRJ_FREERTOS_CFG) \
        -I$(UNITTEST_INCLUDE_DIR)

SRC_FILES = \
    ./test/FreeRTOS_mock.cpp \
    ./src/XXX.cpp

#Specify all unittest files
UNITTEST_SRC_FILES = \
    ./test/TestSuiteXXX_unittest.cpp

如果您有改进建议,请发表评论!

答案 1 :(得分:0)

一种选择是为主机构建应用程序,然后,当HW到达时,您可以为该HW重新编译它。

可以在主机PC上运行FreeRTOS作为CPU上的操作系统,但这不是FreeRTOS的目的,因此在重新部署硬件时可能会有些棘手或导致一些不切实际的黑客攻击。 / p>

在Windows上运行FreeRTOS有一些支持,但我对Linux不太确定。

替代方案是freeRTOS模拟器。需要注意的是,在仿真中,FreeRTOS不是实际的内核(就像它在目标硬件上一样),而是由Windows / Linux内核设置的线程来运行FreeRTOS代码。鉴于FreeRTOS旨在用于困难时间限制,这种模拟远非理想,因为时间最终由主机内核决定。

可以使用Visual Studio(免费版)运行Windows模拟器,并维护该端口。 Eclipse也可能有一些支持。

Windows模拟器页面:http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html

Linux模拟器页面:http://www.freertos.org/FreeRTOS-simulator-for-Linux.html