具有参数的嵌入式系统上的最小c ++回调

问题描述 投票:3回答:2

我正在嵌入式系统上使用c ++进行开发。由于资源限制,我不允许在回调中使用std::function

我想从软件的上层注册一个回调,并在一个非常低级的驱动程序中执行它。问题是此回调还需要将参数作为数组传递,并且我想避免使用全局变量。

低级驱动程序:

using callback = void (*)(uint32_t data[2]);

// extern C because it is executed inside an c style interrupt, don't ask
extern "C" {
static callback global_cb = nullptr;

void ExecuteCallback(uint32_t data[2]) {
    if (global_cb != nullptr) {
        global_cb(data);
    }
}

void Interrupt() {
 // Error occured
    uint32_t logData[2] = { 0, 1}; // Dummy data for stackoverflow
    ExecuteCallback(logData);
} 
}

void low_level_driver::RegisterCallback(callback cb) {
    global_cb = cb;
}


应用层看起来像这样:

#include "low_level_driver.h"

ResetHandler::ResetHandler() {
    low_level_driver.RegisterCallback(MyCallback);
}

void ResetHandler::MyCallback(uint32_t logData[2]) {
  // log the Data
}

目前,我无法以任何可能的方式注册我的回调。我知道我的回调错误,或者我如何尝试在应用程序层内部注册它是错误的。需要帮助。

编辑:无论这种设计有多糟糕。我正在寻找以下内容:基本上只是一种带有参数的回调的方法。

c++ function callback embedded
2个回答
0
投票

std :: function的替代方法既不擦除也不分配类型。

我个人最喜欢的是delegate implementationIncludeOS。在函数签名之后,它还有两个附加的模板参数,这些参数允许自定义回调大小,并根据其是否是纯函数(基本上是一个自由函数),可微写的或两者都不可选进行一些可选的优化。这些附加参数的缺点是,如果您使用许多其他变体,则可能会使代码code肿。

另一种替代方法可能是MBed所做的。他们有一个名为CThunk的类,该类甚至在其描述中指出其目的是将回调重定向到非静态成员函数。我还没有使用过它,该API似乎不太现代和花哨,但它可能满足您的需求。


0
投票

回调应为静态,请尝试使MyCallback为静态。

© www.soinside.com 2019 - 2024. All rights reserved.