搜索
bottom↓
回复: 12

回调函数的问题

[复制链接]

出0入10汤圆

发表于 2014-10-19 13:01:56 | 显示全部楼层 |阅读模式
μC/OS-III中定时器到期后会调用一个回调函数,其定义类型类型如下
typedef  void                      (*OS_TMR_CALLBACK_PTR)(void *p_tmr, void *p_arg);
执行的流程:
1.首先定义变量函数指针变量            OS_TMR_CALLBACK_PTR  p_fnct;
2.获取回调函数并执行。有两个参数,一个是我们回调函数的参数,一个是定时器的p_tmr。(*p_fnct)((void *)p_tmr,p_tmr->CallbackPtrArg);
一般我们都会定义回调函数如下:
void MyCallBackFnct(void *p_arg)
那么执行的时候为什么可以传入两个参数,传入两个参数,而我们定义回调函数的时候只有一个是不是前一个被舍弃掉了?这些又是什么方面的C语言知识?
  1.                     p_fnct = p_tmr->CallbackPtr;                 /* Execute callback function if available            */
  2.                     if (p_fnct != (OS_TMR_CALLBACK_PTR)0)
  3.                     {
  4.                         (*p_fnct)((void *)p_tmr,//传递了两个参数,执行回调函数
  5.                                   p_tmr->CallbackPtrArg);
  6.                     }
复制代码


出0入8汤圆

发表于 2014-10-19 13:55:40 来自手机 | 显示全部楼层
回调函数的定义原型要一致,这边定时器的回调函数,也需要两个参数。

出0入10汤圆

 楼主| 发表于 2014-10-19 13:59:48 | 显示全部楼层
security 发表于 2014-10-19 13:55
回调函数的定义原型要一致,这边定时器的回调函数,也需要两个参数。

可是官方的定时器回调函数也是跟我一样设置的

出0入8汤圆

发表于 2014-10-19 15:02:22 来自手机 | 显示全部楼层
从你的描述来看,MyCallBackFnct是只有一个参数,但貌似不是跟OS_TMR_CALLBACK_PTR对应的,也没看到关联的代码。

出0入0汤圆

发表于 2014-10-19 15:05:48 | 显示全部楼层
楼主的代码不全,看不出来你问的问题

出0入0汤圆

发表于 2014-10-19 19:25:36 | 显示全部楼层
能具体说下,哪里定义了一个参数。
我只看到执行是两个参数。

出0入10汤圆

 楼主| 发表于 2014-10-19 20:10:08 | 显示全部楼层
gujiamao_love 发表于 2014-10-19 19:25
能具体说下,哪里定义了一个参数。
我只看到执行是两个参数。

void MyCallBackFnct(void *p_arg)这个啊,官方就是这样子写回调函数的。

出0入10汤圆

 楼主| 发表于 2014-10-19 20:10:32 | 显示全部楼层
hdd961140543 发表于 2014-10-19 15:05
楼主的代码不全,看不出来你问的问题

void MyCallBackFnct(void *p_arg)这个啊,官方就是这样子写回调函数的。

出0入0汤圆

发表于 2014-10-19 20:12:17 | 显示全部楼层
10xjzheng 发表于 2014-10-19 20:10
void MyCallBackFnct(void *p_arg)这个啊,官方就是这样子写回调函数的。

哦 还以为是你自己举得例子。

出0入10汤圆

 楼主| 发表于 2014-10-19 20:13:59 | 显示全部楼层
gujiamao_love 发表于 2014-10-19 20:12
哦 还以为是你自己举得例子。

大神,赶紧看下是怎么回事?

出0入0汤圆

发表于 2014-10-19 20:56:22 | 显示全部楼层
OS_TMR_CALLBACK_PTR  跟 MyCallBackFnct有关系吗?

出0入10汤圆

 楼主| 发表于 2014-10-19 21:10:47 | 显示全部楼层
gujiamao_love 发表于 2014-10-19 20:56
OS_TMR_CALLBACK_PTR  跟 MyCallBackFnct有关系吗?

开始p_tmr->CallbackPtr=MyCallBackFnct;
后来p_fnct = p_tmr->CallbackPtr;
所以是一样的

出0入0汤圆

发表于 2014-10-19 21:28:17 来自手机 | 显示全部楼层
我没有楼主这么仔细考虑过,我记得定时器的回调函数也可以没有形参也可以的,应该是函数指针的隐性转换
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 07:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表