我有一个类似这样的 API :
ISRInstall(int ISRnum,void(*FUNC)(void))
但是我的回调函数是
void task(void*)
。
API制作者建议我使用蹦床作为入口。 以下是NEW BING给我的解决方案
#include <stdio.h>
typedef struct {
void (*func)(void*);
int data;
} Callback;
static void trampoline(void* arg) {
Callback* cb = (Callback*)arg;
cb->func(&(cb->data));
}
void task(void* arg) {
int* data = (int*)arg;
printf("The data is %d\n", *data);
}
void ISRinstall(int ISRnum, void (*FUNC)(void)) {
printf("Registering ISR %d to function %p\n", ISRnum, FUNC);
}
int main() {
int task_data = 42;
Callback cb;
cb.func = task;
cb.data = task_data;
ISRinstall(1, trampoline);
trampoline(&cb);
return 0;
}
我不明白的是直接使用
void task(&task_data)
有什么区别,因为它们都是void(*)(void*)
。
那么用trampoline作为
void(*FUNC)(void)
的入口来传递带有争论的函数是正确的做法吗?
使用trampoline作为void(*FUNC)(void)的入口来传递带有争论的函数是正确的方法吗?
正确的方法是使用全局变量。回调不采用任何上下文。由于 ISR 本身是“全局”的,因此处理信号是必须使用全局变量的情况之一。