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

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

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

low_level_driver:

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
}

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

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

coldboyjack 回答:具有参数的嵌入式系统上的最小C ++回调

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

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

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

,

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

本文链接:https://www.f2er.com/3075249.html

大家都在问