如何使用void(*FUNC)(void)

问题描述 投票:0回答:1

我有一个类似这样的 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)
的入口来传递带有争论的函数是正确的做法吗?

c function-pointers interrupt
1个回答
0
投票

使用trampoline作为void(*FUNC)(void)的入口来传递带有争论的函数是正确的方法吗?

正确的方法是使用全局变量。回调不采用任何上下文。由于 ISR 本身是“全局”的,因此处理信号是必须使用全局变量的情况之一。

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