欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

钩子函数

最编程 2024-02-11 21:58:40
...

空闲任务函数OSIdleTaskHook()

函数代码如下:

void OSIdleTaskHook (void)
{
#ifOS CFG APP HOOKS EN> Ou
    if (OS_ AppIdleTaskHookPtr != (OS_ APP HOOK_ VOID)0) {
       (*OS_ AppIdleTaskHookPtr)(); 
   }
#endif
}

从上面的函数代码中可以看出要使用空闲任务钩子函数的话需要将宏
OS_CFG_APP_HOOKSEN置1,即允许使用空闲任务的钩子函数
。当时使能空闲任务的钩子函数以后每次进入空闲任务就会调用指针OS_ AppIdleTaskHookPtr所指向的函数。
App_ OS_ SetAllHooks()函数代码如下:

void App_ OS_ SetAllHooks (void)
{
#ifOS CFG APP HOOKS EN> Ou
CPU_ SR_ ALLOCO); 

	CPU_CRITICAL_ENTERO;
	OS_AppTaskCreateHookPtr = App_ OS_ TaskCreateHook;
	OS_AppTaskDelHookPtr = App_OS_TaskDelHook;
	OS_AppTaskReturnHookPtr = App_OS_TaskReturnHook;
	OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook;
	OS_AppStatTaskHookPtr = App_OS_StatTaskHook; 
	OS_AppTaskSwHookPtr = App_OS_TaskSwHook;
	OS_AppTimeTickHookPtr = App_OS_TimeTickHook;
	CPU_ CRITICAL_ EXIT();
#endif
}

OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook该语句是将App_OS_IdleTaskHook复制给OS_AppIdleTaskHookPtr,
而OS_AppIdleTaskHookPtr是一个函数:

void App_OS_IdleTaskHook(void)
{

}

空闲任务的钩子函数OSIdleTaskHook()工作原理:OSIdleTaskHook中最终调用的是函数App_ OS_ Idle TaskHook(),也就是说如果我们要想在空闲任务的钩子函数中做一些其他处理的话就需要将程序代码写在App_OS_IdleTaskHook()函数中

注意!:

在空闲任务的钩子函数中不能调用任何可以是空闲进入等待态的代码,原因很简单,CPU总是在不停的运行,需要一直工作,不能让CPU停下来,哪怕是执行一些对应用没有任何用的代码,比如简单的将-一个变量加一。在UCOS中为了让CPU一直工作,在所有应用任务都进入等待态的时候CPU会执行空闲任务,我们可以从空闲任务的任务函数OS_ IdleTask()看出,在OS_ IdleTask(中 没有任何可以让空闲任务进入等待态的代码。如果在OS_ IdleTask()中有可以让空闲任务进入等待态的代码的话有可能会在同一时刻所有任务(应用任务和空闲任务)同时进入等待态,此时CPU就会无所事事了,所以在空闲任务的钩子函数OSIdle TaskHook()
中不能出现可以让空闲任务进入等待态的代码!