我正在开发一个嵌入式系统的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
}
目前我无法以任何方式注册我的回调函数。 我知道我的回调函数或者我尝试在应用程序层中注册它的方式是错误的。需要帮助。
编辑: 无论这个设计有多糟糕,我都在寻找以下内容: 基本上只需要一种具有参数的回调方法。
void (*)(uint32_t data[2]);
不是成员函数指针。您可以尝试传递不捕获任何内容的lambda表达式或自由函数,甚至将MyCallback
设为static
。 - Georgevoid MyCallback(uint32_t logData[2]) { // log the Data }
,如果你喜欢,你也可以在头文件中声明它,只要它不在任何类或结构体的范围内。一个lambda可能看起来像这样low_level_driver.RegisterCallback([] (uint32_t logData[2]) -> void { // log the Data });
。 - George