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

2020-02-19 21:22发布

前言:今天看到论坛上一个帖子在问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. }
复制代码

4.png (37.91 KB, 下载次数: 0) 下载附件 2014-12-1 22:26 上传

我们在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]
。。还请高手明示一下。
之前见过论坛发过一个 浅谈单片机应用程序架构 的文章,。但是可以实现多个任务。

浅谈单片机应用程序架构.pdf (128.08 KB, 下载次数: 46) 2014-12-1 22:35 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
38条回答
彼岸花开@
1楼-- · 2020-02-21 11:10
fengyunyu 发表于 2014-12-2 00:57
typedef void (*T_RTC_Callback)(void);,定义函数指针的标准方法。

1、这也是后来好不容易才理解的函数指针。
2、有什么不标准的方法来定义函数指针吗?看一下。省的那天,看到一个不标准的函数指针,自己不太认识
fengyunyu
2楼-- · 2020-02-21 14:11
 精彩回答 2  元偷偷看……
yangwc
3楼-- · 2020-02-21 17:43
"同时初始化为强制转换的NULL 类型(此处描述不是很好)"
是赋值为NULL,数据类型为T_RTC_Callback。
彼岸花开@
4楼-- · 2020-02-21 19:44
yangwc 发表于 2014-12-2 09:18
"同时初始化为强制转换的NULL 类型(此处描述不是很好)"
是赋值为NULL,数据类型为T_RTC_Callback。 ...

谢谢。。
1、此处的赋值为NULL 是不是必须的呢。。我感觉是必须的。。但是又有点没有依据。。
2、同样。数据类型T_RTC_Callback  加和不加。有什么区别呢。
fengyunyu
5楼-- · 2020-02-21 22:20
彼岸花开@ 发表于 2014-12-2 09:21
谢谢。。
1、此处的赋值为NULL 是不是必须的呢。。我感觉是必须的。。但是又有点没有依据。。
2、同样。 ...

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

LZ是指这里么?这里就是一般的指针初始化为0(也即null),避免出现“野指针”,没啥特别的,不是必须的。
彼岸花开@
6楼-- · 2020-02-22 02:50
fengyunyu 发表于 2014-12-2 09:26
T_RTC_Callback RTC_Callback[1] = {(T_RTC_Callback)NULL};

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

好的,明白了。

一周热门 更多>