打印
[新手园地]

学习体会第三贴——GPIO中断应用之 理解回调函数

[复制链接]
6600|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdmgb520|  楼主 | 2011-9-17 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gdmgb520 于 2011-9-21 22:22 编辑

GPIO中断应用之理解回调函数


今天看神龙的GPIO中断讲课笔记。感觉神龙讲的很详细,很细致,非常实用。但对于我等只玩过单片机,没有接触过嵌入式的菜鸟,还有一个问题需要先弄明白,那就是神龙多次提及的回调。由于单片机编程中一般很少使用回调,所以,如果没有接触过嵌入式编程,C语言一般还是比较薄弱的。
下面我分享下我的学习过程,希望对C语言基础比较薄弱的童鞋有所帮助。不对的地方还请大家指点.

阅读前最好是先看神龙的GPIO中断的讲课笔记,然后带着问题来读。


1.函数指针

static void (*_pfGPABCallback)(uint32_tu32GPAStatus, uint32_t u32GPBStatus);
static void (*_pfGPCDECallback)(uint32_tu32GPCStatus, uint32_t u32GPDStatus, uint32_t u32GPEStatus);
static void (*_pfEINT0Callback)(void);
static void (*_pfEINT1Callback)(void);


这里是定义了四个指针变量,以第一个为例,_pfGPABCallback 是一个指针变量,他指向一个函数,该函数返回值为 void型,且该函数是模块内部函数,该函数有两个uint32_t型参数


2.函数指针的使用举例


#include
<stdio.h>

#include
<string.h>


char * fun(char *p1,char *p2)


{



inti = 0;



i = strcmp(p1,p2);



if(0 ==i)



{



returnp1;



}



else



{



returnp2;



}

}

void main(void)

{


char* (*pf)(char *p1,char*p2);



pf = &fun;



(*pf)("ab","bb");



pf("cc","dd");


}

上面main函数中第3行和第4行使用了两种不同 调用方式。通常情况下应该是使用第一种调用方式,但是很多编译器都支持第二种调用方式。
VC2008中可以看到 pf *pf 的值是一样的,但类型不同:

名称

类型

pf
0x004111c7 _fun
char* (char *, char *)*

*pf
0x004111c7_fun
char * (char *, char *)
而我们在M0的例程中见到的就是第二种调用方式,即:

if ( _pfGPABCallback )

_pfGPABCallback(u32GPAStatus, u32GPBStatus);

如果指针变量 _pfGPABCallback不为空,则调用该变量所指向的含水量。


3.指针变量在哪里被赋值了

2中的例子中我们见到了这条语句:
pf= &fun;
那么在M0的中断例子中这条语句在哪里呢?

DrvGPIO_SetIntCallback(GPABCallback,GPCDECallback);
该函数的定义如下:

voidDrvGPIO_SetIntCallback(GPIO_GPAB_CALLBACK pfGPABCallback, GPIO_GPCDE_CALLBACKpfGPCDECallback)


{


_pfGPABCallback
= (void (*)(uint32_t,uint32_t))pfGPABCallback;


_pfGPCDECallback= (void (*)(uint32_t, uint32_t, uint32_t))pfGPCDECallback;


}


另外:


typedefvoid (*GPIO_GPAB_CALLBACK)(uint32_t u32GPAStatus, uint32_t u32GPBStatus);





所以可以看出:


DrvGPIO_SetIntCallback(GPABCallback,GPCDECallback);


这条调用语句是把两个函数指针(函数地址)传入了该函数,该函数再把这两个指针赋值给变量pfGPABCallback pfGPCDECallback





这个过程大体上明白了吧。呵呵。

相关帖子

沙发
hotpower| | 2011-9-19 06:20 | 只看该作者
学习就是总结和消化吸收的过程。

使用特权

评论回复
板凳
gdmgb520|  楼主 | 2011-9-19 13:13 | 只看该作者
恩,遇到一个问题,搞懂一个问题。我相信慢慢会有提高。

使用特权

评论回复
地板
lixiaoxu2meng| | 2011-9-21 14:48 | 只看该作者
不错 帮顶

使用特权

评论回复
5
gdmgb520|  楼主 | 2011-9-22 08:30 | 只看该作者
呵呵。谢谢,争取下次写得更好。

使用特权

评论回复
6
Ryanhsiung| | 2011-10-13 13:31 | 只看该作者
没看懂,能否给 神龙的GPIO中断的讲课笔记的连接,我找不到

使用特权

评论回复
7
tao560532| | 2011-10-13 15:42 | 只看该作者
呵呵,顶一个

使用特权

评论回复
8
回到从前| | 2012-6-28 17:18 | 只看该作者
呵呵,学习学习!

使用特权

评论回复
9
liubb1981| | 2012-12-17 13:42 | 只看该作者
谢谢,讲的很仔细

使用特权

评论回复
10
lkl0305| | 2015-7-29 12:24 | 只看该作者
学习学习

使用特权

评论回复
11
64xiaodian| | 2016-1-25 17:17 | 只看该作者
太菜了,很需要学习一下

使用特权

评论回复
12
64xiaodian| | 2016-2-22 15:57 | 只看该作者
自己以前只学过51单片机,基础太薄弱:'(

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝