搜索
bottom↓
回复: 38

ke02 例程RTC_demo例程中回调函数应用的分析

[复制链接]

出0入0汤圆

发表于 2014-12-1 22:36:50 | 显示全部楼层 |阅读模式
前言:今天看到论坛上一个帖子在问RTC_demo 中LED_TOGGLE是怎么调用的,大家解答是回调函数。最近也有所研究,。就分析一个。跟大家分析一下。   原帖 http://www.amobbs.com/forum.php? ... p;page=1#pid8206232

说明:软件平台 keil   使用KE02_SC官方例程

  1. void RTC_Task(void)
  2. {
  3.     /* toggle LED1 */
  4.     LED1_Toggle();
  5. }
复制代码

这段代码出现在RTC_demo.c 文件的line 106 ~ 110 行。

调用这个函数的代码在
RTC_demo.c文件的line 64  具体的实现函数     RTC_SetupTimerCallback(RTC_Task);
这个函数出现在初始化中。
我们使用KEIL的跟踪功能,可以找到  如下的代码

  1. /*FUNCTION****************************************************************
  2. *
  3. * Function Name    : RTC_SetupTimerCallback
  4. * Returned Value   : none
  5. * Comments         :
  6. *    This function sets the callback function.
  7. *
  8. *END*********************************************************************/
  9. void RTC_SetupTimerCallback(T_RTC_Callback pfnCallback)
  10. {
  11.     RTC_Callback[0] = pfnCallback;
  12. }
复制代码



我们可以看到这个函数的形参类型是T_RTC_Callback 这个类型。
我们再次使用KEIL 的跟踪功能。,可以看到 typedef void (*T_RTC_Callback)(void);
这个在 rtc.h中。。分析一下。我们知道 这是一个指向函数的指针。
我们在来看看这个函数里边的内容。
将形参pfnCallback 赋值到了数组RTC_Callback[0] 中。我们在来看看这个数组


/******************************************************************************
* Local variables
******************************************************************************/
T_RTC_Callback RTC_Callback[1] = {(T_RTC_Callback)NULL};

这个数组也是一个T_RTC_Callback   指针 这个类型的。同时初始化为强制转换的NULL 类型(此处描述不是很好)

我们的程序。在使用时候,就不会是直接的使用RTC_Task()这个函数了。。而是调用RTC_Callback[0]来实现了


之前的那个帖子说。找不到在哪里调用的。。在主函数中,我们仅仅使用了使用了初始化。没有在此出现。
那么我们就该思考另一种模式。就是前后台模式。这么我们的代码其实就是在前台中实现调用的,也就是rtc的中断中。


我们在line 117 行看到
    if(RTC_Callback[0])
    {   
        RTC_Callback[0]();     
    }
这边先判断了一下RTC_Callback[0] 之前我们初始化的使用初始化为NULL 。。
如果我们初始化了   RTC_SetupTimerCallback(RTC_Task);
那么我们就能够正常的调用了。

后记:如果实现两个RTC_Task(); 不是很明白在这个例程中该怎么个实现法。
因为如果我们两次调用这段代码void RTC_SetupTimerCallback(T_RTC_Callback pfnCallback)
{
    RTC_Callback[0] = pfnCallback;
}

那么我们的两个任务将会同时使用   RTC_Callback[0]
。。还请高手明示一下。
之前见过论坛发过一个 浅谈单片机应用程序架构 的文章,。但是可以实现多个任务。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-12-2 21:39:06 | 显示全部楼层
http://www.amobbs.com/forum.php? ... page%3D1#pid8210799  这个回调函数的帖子。大家可以进步一步参考。。
此贴仅仅是分析了一下ke02_sc 中例程的具体应用。。

出0入0汤圆

发表于 2014-12-1 22:52:17 | 显示全部楼层
谢谢楼主的讲解,楼主费心了

出0入0汤圆

 楼主| 发表于 2014-12-1 23:00:54 | 显示全部楼层
附KE02_SC

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-12-1 23:01:10 | 显示全部楼层
楼主,我手上有一块KE02Z的开发板。
怎么才能开始使用这块开发板呢?
我在飞思卡尔的官网那个上没有找到使用的教程啊。

出0入0汤圆

 楼主| 发表于 2014-12-1 23:04:24 | 显示全部楼层
PCBBOY1991 发表于 2014-12-1 23:01
楼主,我手上有一块KE02Z的开发板。
怎么才能开始使用这块开发板呢?
我在飞思卡尔的官网那个上没有找到使 ...

1、我也有一块
2 、我也没有上手呢。学生乱忙。。。
3、官网确实没有什么教程。
4、论坛有几个帖子。到是可以参考一下。
5、这个帖子只是分析了一个回调函数的应用。。芯片具体的我还没有具体研究。。
6 、学习的使用定会发表心得。大家一同进步。

出0入0汤圆

发表于 2014-12-1 23:11:39 | 显示全部楼层
彼岸花开@ 发表于 2014-12-1 23:04
1、我也有一块
2 、我也没有上手呢。学生乱忙。。。
3、官网确实没有什么教程。

恩,谢谢。
院线从来没有用过ARM,懂得不多。

出0入0汤圆

 楼主| 发表于 2014-12-1 23:12:08 | 显示全部楼层
lzl000 发表于 2014-12-1 22:52
谢谢楼主的讲解,楼主费心了

前段时间,也看过回调函数 函数指针的应用,真好有需要就分析一下,加深自己的理解。。

出0入0汤圆

发表于 2014-12-1 23:15:38 | 显示全部楼层
彼岸花开@ 发表于 2014-12-1 23:04
1、我也有一块
2 、我也没有上手呢。学生乱忙。。。
3、官网确实没有什么教程。

http://www.amobbs.com/thread-5557000-1-1.html
在论坛找到一个帖子,算然是KL25Z的,但是是类似的。

出0入0汤圆

发表于 2014-12-1 23:25:34 | 显示全部楼层
个人理解,RTC_Callback[1]在定义时只定义了1个,可以改为RTC_Callback[2]  来实现俩个,但看程序,这样改还是有点费事的,具体的还要看RTC_Callback具体实现的功能

出100入101汤圆

发表于 2014-12-2 00:57:47 | 显示全部楼层
typedef void (*T_RTC_Callback)(void);,定义函数指针的标准方法。

出0入0汤圆

发表于 2014-12-2 07:27:55 | 显示全部楼层
恩 好详细的讲解啊

出0入0汤圆

 楼主| 发表于 2014-12-2 07:30:09 | 显示全部楼层
wxfje 发表于 2014-12-1 23:25
个人理解,RTC_Callback[1]在定义时只定义了1个,可以改为RTC_Callback[2]  来实现俩个,但看程序,这样改 ...

1、定义2个的话。也不是很好实现
2 、结合结构体和数组的话。到是可以实现的。。

出0入0汤圆

 楼主| 发表于 2014-12-2 07:32:15 | 显示全部楼层
fengyunyu 发表于 2014-12-2 00:57
typedef void (*T_RTC_Callback)(void);,定义函数指针的标准方法。

1、这也是后来好不容易才理解的函数指针。
2、有什么不标准的方法来定义函数指针吗?看一下。省的那天,看到一个不标准的函数指针,自己不太认识

出100入101汤圆

发表于 2014-12-2 09:10:19 | 显示全部楼层
彼岸花开@ 发表于 2014-12-2 07:32
1、这也是后来好不容易才理解的函数指针。
2、有什么不标准的方法来定义函数指针吗?看一下。省的那天, ...


也不是很懂,一下在boot跳转到app时常用

// 定义函数指针
void (*pfunc)();    //函数指针

// 函数指针赋值
pfunc =( void (*)()) 0x40000000;         

// 跳转
(*pfunc)();                   

出0入0汤圆

发表于 2014-12-2 09:18:03 | 显示全部楼层
"同时初始化为强制转换的NULL 类型(此处描述不是很好)"
是赋值为NULL,数据类型为T_RTC_Callback。

出0入0汤圆

 楼主| 发表于 2014-12-2 09:21:35 | 显示全部楼层
yangwc 发表于 2014-12-2 09:18
"同时初始化为强制转换的NULL 类型(此处描述不是很好)"
是赋值为NULL,数据类型为T_RTC_Callback。 ...

谢谢。。
1、此处的赋值为NULL 是不是必须的呢。。我感觉是必须的。。但是又有点没有依据。。
2、同样。数据类型T_RTC_Callback  加和不加。有什么区别呢。

出100入101汤圆

发表于 2014-12-2 09:26:00 | 显示全部楼层
彼岸花开@ 发表于 2014-12-2 09:21
谢谢。。
1、此处的赋值为NULL 是不是必须的呢。。我感觉是必须的。。但是又有点没有依据。。
2、同样。 ...

T_RTC_Callback RTC_Callback[1] = {(T_RTC_Callback)NULL};

LZ是指这里么?这里就是一般的指针初始化为0(也即null),避免出现“野指针”,没啥特别的,不是必须的。

出0入0汤圆

 楼主| 发表于 2014-12-2 09:27:13 | 显示全部楼层
fengyunyu 发表于 2014-12-2 09:26
T_RTC_Callback RTC_Callback[1] = {(T_RTC_Callback)NULL};

LZ是指这里么?这里就是一般的指针初始化为 ...

好的,明白了。

出0入0汤圆

发表于 2014-12-2 09:31:17 | 显示全部楼层
彼岸花开@ 发表于 2014-12-2 09:21
谢谢。。
1、此处的赋值为NULL 是不是必须的呢。。我感觉是必须的。。但是又有点没有依据。。
2、同样。 ...

如果不初始化为NULL,程序有跑飞的风险。
NULL没有数据类型。可不不进行强制转换。

出0入0汤圆

发表于 2014-12-2 21:21:39 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2014-12-2 21:30:57 | 显示全部楼层
谢谢楼主分享,看了一遍,觉得很不错。

出0入0汤圆

 楼主| 发表于 2014-12-2 21:37:35 | 显示全部楼层
openm4 发表于 2014-12-2 21:30
谢谢楼主分享,看了一遍,觉得很不错。

1、中间我的那个问题。您有什么好的方面没有。。。例程的中断函数对应一个任务比较好用。如果几个的话。就不怎么好用
2、 在1点中的不好用,也是相对的。我们增加几个初始化函数也是可以实现多个任务的 。
3、结合结构体和数组。感觉能够更加的简洁。

出0入0汤圆

 楼主| 发表于 2014-12-2 21:45:04 | 显示全部楼层
fengyunyu 发表于 2014-12-2 09:10
也不是很懂,一下在boot跳转到app时常用

// 定义函数指针

这个确实很难理解呀。。
只能回头再理解了。谢谢分享这种用法。

出0入0汤圆

发表于 2014-12-5 14:52:40 | 显示全部楼层
基本上看懂了。楼主提出的两个任务的问题,盼望那个大侠写一下,我们这样就能更好的理解这个回调函数了。

出0入0汤圆

发表于 2014-12-5 15:26:26 | 显示全部楼层
回调函数,函数指针挺好用的,不过Keil C51用起来不方便

出0入0汤圆

发表于 2014-12-5 15:31:45 | 显示全部楼层
ijlc1314 发表于 2014-12-5 15:26
回调函数,函数指针挺好用的,不过Keil C51用起来不方便

Keil C51不可以用回调涵数吗?

出0入0汤圆

发表于 2014-12-5 15:57:32 | 显示全部楼层
holts2 发表于 2014-12-5 15:31
Keil C51不可以用回调涵数吗?

可以,但比较麻烦,使用函数指针,Keil C51在某些情况无法建立正确的调用树导致程序不正常

出0入0汤圆

发表于 2014-12-5 16:11:31 | 显示全部楼层
架构,有点虚的东西~

出0入0汤圆

 楼主| 发表于 2014-12-5 16:17:18 | 显示全部楼层
ijlc1314 发表于 2014-12-5 15:57
可以,但比较麻烦,使用函数指针,Keil C51在某些情况无法建立正确的调用树导致程序不正常 ...

调用树?这是什么概念呢。

出0入0汤圆

 楼主| 发表于 2014-12-5 16:17:50 | 显示全部楼层
songjie 发表于 2014-12-5 16:11
架构,有点虚的东西~

虚的东西。是一种思想性的东西哈。

出0入0汤圆

发表于 2014-12-6 08:36:50 | 显示全部楼层
彼岸花开@ 发表于 2014-12-5 16:17
调用树?这是什么概念呢。

Keil C51才有的吧

出0入0汤圆

 楼主| 发表于 2014-12-6 08:42:04 | 显示全部楼层

恩。好吧。。我搜搜看。。。

出0入0汤圆

发表于 2014-12-6 15:02:23 | 显示全部楼层

出0入0汤圆

发表于 2014-12-6 16:46:51 | 显示全部楼层
KEIL的跟踪功能怎么样?不会啊!

出0入0汤圆

 楼主| 发表于 2014-12-6 18:16:08 | 显示全部楼层
yjbin 发表于 2014-12-6 16:46
KEIL的跟踪功能怎么样?不会啊!

1-今天debug了一下,感觉keil对ke02的支持不够,看不到寄存器数值,真的好操心

出0入0汤圆

发表于 2015-1-7 21:21:01 | 显示全部楼层
学习一下,看跟gui的回调一样不

出0入0汤圆

发表于 2015-1-8 01:11:59 来自手机 | 显示全部楼层
讲的不错

出0入0汤圆

发表于 2015-1-8 09:05:23 | 显示全部楼层
KE02Z的开发板在路上了。讲的不错。收藏!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-15 00:32

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

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