前言:今天看到论坛上一个帖子在问RTC_demo 中LED_TOGGLE是怎么调用的,大家解答是回调函数。最近也有所研究,。就分析一个。跟大家分析一下。 原帖
http://www.amobbs.com/forum.php? ... p;page=1#pid8206232
说明:软件平台 keil 使用KE02_SC官方例程
- void RTC_Task(void)
- {
- /* toggle LED1 */
- LED1_Toggle();
- }
复制代码
这段代码出现在RTC_demo.c 文件的line 106 ~ 110 行。
调用这个函数的代码在
RTC_demo.c文件的line 64 具体的实现函数 RTC_SetupTimerCallback(RTC_Task);
这个函数出现在初始化中。
我们使用KEIL的跟踪功能,可以找到 如下的代码
- /*FUNCTION****************************************************************
- *
- * Function Name : RTC_SetupTimerCallback
- * Returned Value : none
- * Comments :
- * This function sets the callback function.
- *
- *END*********************************************************************/
- void RTC_SetupTimerCallback(T_RTC_Callback pfnCallback)
- {
- RTC_Callback[0] = pfnCallback;
- }
复制代码
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 上传
点击文件名下载附件
可以,但比较麻烦,使用函数指针,Keil C51在某些情况无法建立正确的调用树导致程序不正常
一周热门 更多>