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



我正在嵌入式系统上用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
}

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

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

除了std::函数之外,还有一些既不键入擦除也不进行分配的选项。

我个人最喜欢的是IncludeOS的委托实现。在函数签名之后,它有两个额外的模板参数,允许自定义回调大小,并根据它是否是纯函数(基本上是一个自由函数(、是否可复制或两者都不可复制进行一些可选优化。这些附加参数的缺点是,如果你使用很多不同的变体,它可能会使你的代码膨胀

另一种选择可能是MBed的做法。它们有一个名为CThunk的类,该类甚至在描述中声明其目的是将回调重定向到非静态成员函数。我还没有使用过它,API似乎没有那么现代和新奇,但它可能适合你的需求。

回调应该是静态的,请尝试使MyCallback是静态的。

最新更新