其他分享
首页 > 其他分享> > ucosIII学习笔记——钩子函数

ucosIII学习笔记——钩子函数

作者:互联网

一开始听见钩子函数感觉很莫名其妙,更不知道它有何作用,这是第一篇博客,也是学习ucosIII操作系统的一个开始吧。

在系统中有开发者自己创建的任务也有系统内部任务 ,UCOSIII中有五个系统任务,分别为

  UCOSIII 的任务数是无数的,但是在实际使用中考虑到硬件资源 (ROM 和 RAM)等因素,不可能真的使用无数的任务,

在 UCOSIII 中可以使用宏 OS_CFG_PRIO_MAX 来定义可使用的任务数,

默认情况下 OS_CFG_PRIO_MAX 为 64。空闲 任务优先级为 OS_CFG_PRIO_MAX-1,说明空闲任务的优先级为最低的。

  时钟节拍任务是 UCOSIII 必须创建的,同样,不需要我们手工创建。
 时钟节拍任务的任务优先级为 OSCfg_TickTaskPrio,时钟节拍任务的优先级尽可能的高一点, 有些 默认设置时钟节拍任务的任务优先级为 1。

  时钟节拍任务的作用是跟踪正在延时的任务,以及在指定时间内等待某个内核对象的任务,

  在 UCOSIII 中统计任务可用来统计 CPU 的使用率、各个任务的 CPU 使用率和各任务的堆 栈使用情况,默认情况下统计任务是不会创建的,

如果要使能统计任务的话需要将宏 OS_CFG_STAT_TASK_EN 置 1,宏 OS_CFG_STAT_TASK_EN 在 os_cfg.h 文件中有定义。

当我 们将宏 OS_CFG_STAT_TASK_EN 置 1 以后,

OSinit()函数中有关统计任务的代码就可以编译了 额。OS_StatTaskInit() 函 数 用 来 创 建 统 计 任 务 ,

统 计 任 务 的 优 先 级 通 过 宏 OS_CFG_STAT_TASK_PRIO 设置,

ALIENTEK 将 统 计 任 务 的 优 先 级 设 置 为 OS_CFG_PRIO_MAX-2,也就是倒数第二。 

UCOSIII 提供软件定时器功能,定时任务是可选的,将宏 OS_CFG_TMR_EN 设置为 1 就 会使能定时任务,在 OSInit()中将会调用函数 OS_TmrInit()来创建定时任务。

定时任务的优先级 通过宏 OS_CFG_TMR_TASK_PRIO 定义

当把 os_cfg.h 文件中的宏 OS_CFG_ISR_POST_DEFERRED_EN 置 1 就会使能中断服务管 理任务,UCOSIII 会创建一个名为 OS_IntQTask()的任务,

该任务负责“延迟”在 ISR 中调用的 系统 post 服务函数的行为。中断服务管理任务的任务优先级永远是最高的,为 0!

在 UCOS 中可以通过关闭中断和任务调度器上锁两种方式来管理临界段代码

如果采用后一种,即调度器上锁的方式来管理临界段代码的话, 那么在中断服务函数中调用的“post”类函数就不允许操作诸如任务就绪表、等待表等系统内部 数据结构。

当 ISR(中断服务函数)调用 UCOSIII 提供的“post”函数时,要发送的数据和发送的目的地 都会存入一个特别的缓冲队列中,当所有嵌套的 ISR 都执行完成以后 UCOSIII 会做任务切换,

运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务。这样做的好处 就是可以减少中断关闭的时间,否则,在 ISR 中还需要把任务从等待列表中删除,

并把任务放 入就绪表,以及做一些其他的耗时操作。

钩子函数是这篇文章中自己最想记录的,在ucosIII中有8个钩子函数,

空闲任务的钩子函数为数 OSIdleTaskHook()

可以用来让CPU进入低功耗模式要使用空闲任务的钩子函数需要先将 宏 OS_CFG_APP_HOOKS_EN 置 1

即允许使用空闲任务的钩子函数。当时使能空闲任务的钩子函数以后每次进入空闲任务就会调用指针 OS_AppIdleTaskHookPtr 所指向的函数

复制代码
 1 void  OSIdleTaskHook (void)
 2  { 
 3 #if OS_CFG_APP_HOOKS_EN > 0u   
 4     if (OS_AppIdleTaskHookPtr != (OS_APP_HOOK_VOID)0) 
 5 {       
 6   (*OS_AppIdleTaskHookPtr)();    
 7  } 
 8 #endif 2020-12-20
 9 }
10  
复制代码

 

  os_app_hooks.c 文件,在文件中有个函数 App_OS_SetAllHooks(),

复制代码
1 void  App_OS_SetAllHooks (void) {
2  #if OS_CFG_APP_HOOKS_EN > 0u     CPU_SR_ALLOC(); 
3  
4     CPU_CRITICAL_ENTER();     
5     OS_AppTaskCreateHookPtr = App_OS_TaskCreateHook;       
6 OS_AppTaskDelHookPtr = App_OS_TaskDelHook;
7     OS_AppTaskReturnHookPtr = App_OS_TaskReturnHook; 8    OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook;
9 OS_AppStatTaskHookPtr = App_OS_StatTaskHook;
10 OS_AppTaskSwHookPtr = App_OS_TaskSwHook;
11 OS_AppTimeTickHookPtr = App_OS_TimeTickHook;
12 CPU_CRITICAL_EXIT(); 13 #endif }
复制代码

 

App_OS_IdleTaskHook 复制给 OS_AppIdleTaskHookPtr,App_OS_IdleTaskHook 是一个函数,也就是说如果我们要想在空闲 任务的钩子函数中做一些其他处理的话

就需要将程序代码写在 App_OS_IdleTaskHook()

1 void  App_OS_IdleTaskHook (void)
2  { 
3  ******
4 } 

 

函数中。在空闲任务的钩子函数中不能调用任何可以是空闲进入等待态的代码,。

在 UCOS 中为了让 CPU 一直工作,在所有应用任 务都进入等待态的时候 CPU 会执行空闲任务,我们可以从空闲任务的任务函数 OS_IdleTask() 看出,

在 OS_IdleTask()中没有任何可以让空闲任务进入等待态的代码。如果在 OS_IdleTask()中 有可以让空闲任务进入等待态的代码的话有可能会在同一时刻所有任务(应用任务和空闲任务) 同时进入等待态,

此时 CPU 就会无所事事了,所以在空闲任务的钩子函数 OSIdleTaskHook()中 不能出现可以让空闲任务进入等待态的代码

    钩子函数一般主要是用来扩展其他函数(任务)功能的,钩子函数有如下几个:

   1、空闲任务的钩子函数OSIdleTaskHook(),空闲任务调用这个函数,可以用来让CPU进入低功耗模式

   2、系统初始化的钩子函数OSInitHook(),系统初始化函数OSInit()调用此函数。

   3、统计任务的钩子函数OSStatTaskHook(),统计任务每秒中都会调用这个函数,此函数允许你向统计任务中添加自己的应用函数。

   4、OSTaskCreateHook(),任务创建的钩子函数。

   5、OSTaskDelHook(),任务删除的钩子函数。

   6、OSTaskReturnHook(),任务意外返回时调用的钩子函数,比如删除某个任务

   7、OSTaskSwHook(),任务切换时候调用的钩子函数。

   8、OSTimeTickHook(),滴答定时器调用的钩子函数

空闲任务的钩子函数使用

1 #if OS_CFG_APP_HOOKS_EN    //打开宏,使用空闲任务的钩子函数            
2     App_OS_SetAllHooks();            
3 #endif

 

复制代码
1 void  App_OS_IdleTaskHook (void)//钩子函数功能代码
2 {
3     static int num;
4     num++;
5     if(num%50000==0)
6     {
7         printf("Idle Task Running 50000 times!\r\n");
8     }
9 }
复制代码

 

2020-12-20

标签:ucosIII,函数,钩子,App,笔记,任务,OS,空闲
来源: https://www.cnblogs.com/wulianwangaxing/p/14163222.html