函数指针与中断

122 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 31 天,点击查看活动详情

一、函数指针

内存的作用-----用来存放程序运行过程中的:

  1. 数据
  2. 指令

这里需要强调一下,程序在运行过程中仓库是在外存中的,而工作台是在内存中的。

1. 内存四区

堆区、栈区、数据区、代码区

其中,代码区是存放代码的;另外三个部分是存放数据的。

2. C语言中内存数据的访问方式

  • 直接访问:通过所在空间名称去访问 。

  • 间接访问:通过所在空间首地址去访问, *地址值 此时的*为间接访问运算;上面提到的内存四区中的堆区只能通过这种方式去访问。

3. C语言中函数调用方式

  • 直接调用:通过函数名去调用函数。

  • 间接调用:通过函数在代码区所对应的那份空间的首地址去调用,这里的函数指针正好是存放的首地址

示例程序

int func(int a,int b) 
{ 
    //...... 
} 

int (int a,int b) * pf;//语法错误 
int *pf(int a,int b);//函数声明语句 
int (*pf)(int a,int b);//定义一个函数指针 
pf = &func;//&运算符后面如果是函数名的话可以省略不写 
pf = func; 

y = func(3,4);//直接调用 
y = (*pf)(3,4);//间接调用,*运算符后面如果是函数指针类型则可以省略不写 
y = pf(3,4);//间接调用 

typedef int myint; 
typedef int (*)(int,int) pft;//语法错误 
typedef int (*pft)(int,int) ; 
pft pt;

4. 适用场合

前提:当有很多个同类函数待被调用时

A处:知道所有函数名,由此处来决定B处将会调用哪个函数

B处:负责调用A处指定的函数

思考:A处如何告诉B处被调用的是哪个函数呢,无非两个办法:

  1. 告诉B处函数名,怎么做呢?传字符串----“函数名”? C语言没有对应语法支持

  2. 告诉B处对应函数在代码区的地址

二、中断

1. 什么是中断

一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件 。

分为:

  1. 内部中断: CPU执行程序的过程中,发生的一些硬件出错、运算出错事件(如分母为0、溢出等等),不可屏蔽

  2. 外部中断: 外设发生某种情况,通过一个引脚的高、低电平变化来通知CPU (如外设产生了数据、某种处理完毕等等)

2. 中断处理原则

任何一种中断产生,CPU都会暂停当前执行的程序,跳转到内存固定位置执行一段程序,该程序被称为总的中断服务程序,在该程序中区分中断源,然后进一步调用该中断源对应的处理函数。

中断源对应的处理函数被称为分中断处理程序,一般每一个分中断处理程序对应一个外设产生的中断。

写驱动时,如果外设有中断,则需要编写一个函数(分中断处理程序)来处理这种中断。

3. 中断处理函数原型

示例程序

typedef irqreturn_t (*irq_handler_t)(int, void *); 

/* 
参数: 
int:中断号 
void*:对应的申请中断时的dev_id 

返回值: 
typedef enum irqreturn irqreturn_t; //中断返回值类型 
enum irqreturn { 
    IRQ_NONE = (0 << 0), 
    IRQ_HANDLED = (1 << 0), 
    IRQ_WAKE_THREAD = (1 << 1), 
}; 
返回IRQ_HANDLED表示处理完了,返回IRQ_NONE在共享中断表示不处理
*/