深入分析C语言函数指针和回调函数(2)

上一篇博客文章的地址:http://blog.csdn.NET/morixinguan/article/details/65494239在本节中,让我们看一下函数指针和回调函数在Linux内核中的应用。

从上一节中我们了解到,函数指针和回调函数是开发人员和用户之间的一个示例。

在本节中,我将参考Linux内核中的文件操作结构进行详细说明。

我们首先来看一下这种结构。

该代码位于linux内核的include / linux / fs.h中。

由于代码量大,我仅截取几个基本示例:File_operations文件操作结构:在此代码中,使用结构的封装思想,将函数指针封装在file_operations结构中,然后在驱动程序已实现,具体功能已实现,然后将其分配给结构中的功能指针以进行初始化操作,让我们看一下Friendly Arm的led驱动程序将了解的内容。

以下代码截取了Friendly Arm提供的Linux内核中的tiny4412_leds.c。

首先,定义并初始化一个结构变量。

在此驱动程序中,仅实现了ioctl函数,与上述结构相比,ulocked_ioctl是结构中的函数指针。

long(* unlocked_ioctl)(结构文件*,unsigned int,unsigned long);让我们看一下ADC驱动程序的友好实现。

这也是这样做的方法。

在这里您可以看到:这也是C语言结构的初始化方法,这也是合理的。

& nbsp; & nbsp; & nbsp;在内核中,有许多这样的函数指针,因此,当我们了解了这些例程,然后学习了Linux内核后,我们的思路就会更加清晰。

& nbsp; & nbsp; & nbsp;让我们看一下Linux内核中回调函数的基本应用。

从上一节中我们了解到,回调函数的本质实际上是一个函数指针,但是定义是不同的。

它的定义是:将一个函数指针(地址)作为参数传递给另一个函数,当使用该指针调用由它指向的函数时,我们说这是一个回调函数。

接下来,让我们看一个示例:该代码取自Friendly Arm的按钮驱动程序:我们在tiny4412_buttons_open函数中看到err = request_irq(irq,button_interrupt,IRQ_TYPE_EDGE_BOTH,& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;按钮,(void *)& amp; buttons [i]);让我们看一下request_irq函数:该函数的功能是请求中断。

让我们看一下函数的第二个参数irq_handler_t处理程序。

什么?至此,我们知道第二个参数是使用typedef重新定义的新类型的函数指针。

也就是说,一旦执行了tiny4412的open函数,将通过request_irq的回调函数执行键中断,并返回中断句柄。

这个回调函数实际上是一个中断服务函数。

& nbsp;& nbsp;这就是在内核中使用回调函数的方式。

当然,还有其他。

例如,我们还在tiny4412的打开功能中看到:& nbsp;& nbsp; setup_timer(& amp; buttons [i] .timer,tiny4412_buttons_timer,& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp ;& nbsp;& nbsp;& nbsp;(unsignedlong)& amp; buttons [i]); & nbsp;& nbsp;该功能的功能是注册一个计时器。

计时器由回调函数tiny4412_buttons_timer触发。

如果不看一下它的定义,您可能会认为它是一个普通函数,但实际上它是一个宏函数。

& nbsp;  此宏函数通过调用函数setup_timer_key实现定时器的注册:通过这一部分,我们了解了回调函数在Linux内核中的应用,并为学习Linux内核和分析源代码奠定了基础。

Linux内核。