开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 31 天,点击查看活动详情。
一、函数指针
内存的作用-----用来存放程序运行过程中的:
- 数据
- 指令
这里需要强调一下,程序在运行过程中仓库是在外存中的,而工作台是在内存中的。
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处被调用的是哪个函数呢,无非两个办法:
-
告诉B处函数名,怎么做呢?传字符串----“函数名”? C语言没有对应语法支持
-
告诉B处对应函数在代码区的地址
二、中断
1. 什么是中断
一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件 。
分为:
-
内部中断: CPU执行程序的过程中,发生的一些硬件出错、运算出错事件(如分母为0、溢出等等),不可屏蔽
-
外部中断: 外设发生某种情况,通过一个引脚的高、低电平变化来通知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在共享中断表示不处理
*/