UCOSIII钩子函数

我会带着你远行 2022-06-01 23:29 501阅读 0赞

OSIdleTaskHook
空闲任务调用这个函数,可以用来让CPU进入低功耗模式

  1. void OSIdleTaskHook (void)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppIdleTaskHookPtr != (OS_APP_HOOK_VOID)0) {
  5. (*OS_AppIdleTaskHookPtr)();
  6. }
  7. #endif
  8. }

OSInitHook
系统初始化函数OSInit()调用此函数

  1. void OSInitHook (void)
  2. {
  3. /* 8-byte align the ISR stack */
  4. OS_CPU_ExceptStkBase = (CPU_STK *)(OSCfg_ISRStkBasePtr + OSCfg_ISRStkSize);
  5. OS_CPU_ExceptStkBase = (CPU_STK *)((CPU_STK)(OS_CPU_ExceptStkBase) & 0xFFFFFFF8);
  6. }

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

  1. void OSStatTaskHook (void)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppStatTaskHookPtr != (OS_APP_HOOK_VOID)0) {
  5. (*OS_AppStatTaskHookPtr)();
  6. }
  7. #endif
  8. }

OSTaskCreateHook
任务创建的钩子函数

  1. void OSTaskCreateHook (OS_TCB *p_tcb)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppTaskCreateHookPtr != (OS_APP_HOOK_TCB)0) {
  5. (*OS_AppTaskCreateHookPtr)(p_tcb);
  6. }
  7. #else
  8. (void)p_tcb; /* Prevent compiler warning */
  9. #endif
  10. }

OSTaskDelHook
任务删除的钩子函数

  1. void OSTaskDelHook (OS_TCB *p_tcb)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppTaskDelHookPtr != (OS_APP_HOOK_TCB)0) {
  5. (*OS_AppTaskDelHookPtr)(p_tcb);
  6. }
  7. #else
  8. (void)p_tcb; /* Prevent compiler warning */
  9. #endif
  10. }

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

  1. void OSTaskReturnHook (OS_TCB *p_tcb)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppTaskReturnHookPtr != (OS_APP_HOOK_TCB)0) {
  5. (*OS_AppTaskReturnHookPtr)(p_tcb);
  6. }
  7. #else
  8. (void)p_tcb; /* Prevent compiler warning */
  9. #endif
  10. }

OSTaskSwHook
任务切换时候调用的钩子函数

  1. void OSTaskSwHook (void)
  2. {
  3. #if OS_CFG_TASK_PROFILE_EN > 0u
  4. CPU_TS ts;
  5. #endif
  6. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  7. CPU_TS int_dis_time;
  8. #endif
  9. #if (OS_CPU_ARM_FP_EN == DEF_ENABLED)
  10. // if ((OSTCBCurPtr->Opt & OS_OPT_TASK_SAVE_FP) != (OS_OPT)0) {
  11. // OS_CPU_FP_Reg_Push(OSTCBCurPtr->StkPtr);
  12. // }
  13. // if ((OSTCBHighRdyPtr->Opt & OS_OPT_TASK_SAVE_FP) != (OS_OPT)0) {
  14. // OS_CPU_FP_Reg_Pop(OSTCBHighRdyPtr->StkPtr);
  15. // }
  16. #endif
  17. #if OS_CFG_APP_HOOKS_EN > 0u
  18. if (OS_AppTaskSwHookPtr != (OS_APP_HOOK_VOID)0) {
  19. (*OS_AppTaskSwHookPtr)();
  20. }
  21. #endif
  22. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  23. TRACE_OS_TASK_SWITCHED_IN(OSTCBHighRdyPtr); /* Record the event. */
  24. #endif
  25. #if OS_CFG_TASK_PROFILE_EN > 0u
  26. ts = OS_TS_GET();
  27. if (OSTCBCurPtr != OSTCBHighRdyPtr) {
  28. OSTCBCurPtr->CyclesDelta = ts - OSTCBCurPtr->CyclesStart;
  29. OSTCBCurPtr->CyclesTotal += (OS_CYCLES)OSTCBCurPtr->CyclesDelta;
  30. }
  31. OSTCBHighRdyPtr->CyclesStart = ts;
  32. #endif
  33. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  34. int_dis_time = CPU_IntDisMeasMaxCurReset(); /* Keep track of per-task interrupt disable time */
  35. if (OSTCBCurPtr->IntDisTimeMax < int_dis_time) {
  36. OSTCBCurPtr->IntDisTimeMax = int_dis_time;
  37. }
  38. #endif
  39. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
  40. /* Keep track of per-task scheduler lock time */
  41. if (OSTCBCurPtr->SchedLockTimeMax < OSSchedLockTimeMaxCur) {
  42. OSTCBCurPtr->SchedLockTimeMax = OSSchedLockTimeMaxCur;
  43. }
  44. OSSchedLockTimeMaxCur = (CPU_TS)0; /* Reset the per-task value */
  45. #endif
  46. }

OSTimeTickHook
滴答定时器调用的钩子函数

  1. void OSTimeTickHook (void)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. if (OS_AppTimeTickHookPtr != (OS_APP_HOOK_VOID)0) {
  5. (*OS_AppTimeTickHookPtr)();
  6. }
  7. #endif
  8. }

使用举例

  1. void App_OS_SetAllHooks (void)
  2. {
  3. #if OS_CFG_APP_HOOKS_EN > 0u
  4. CPU_SR_ALLOC();
  5. CPU_CRITICAL_ENTER();
  6. OS_AppTaskCreateHookPtr = App_OS_TaskCreateHook;
  7. OS_AppTaskDelHookPtr = App_OS_TaskDelHook;
  8. OS_AppTaskReturnHookPtr = App_OS_TaskReturnHook;
  9. OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook;
  10. OS_AppStatTaskHookPtr = App_OS_StatTaskHook;
  11. OS_AppTaskSwHookPtr = App_OS_TaskSwHook;
  12. OS_AppTimeTickHookPtr = App_OS_TimeTickHook;
  13. CPU_CRITICAL_EXIT();
  14. #endif
  15. }
  16. void App_OS_IdleTaskHook (void)
  17. {
  18. static int num;
  19. num++;
  20. if(num%50000==0)
  21. {
  22. printf("Idle Task Running 50000 times!\r\n");
  23. }
  24. }

实验现象
1

发表评论

表情:
评论列表 (有 0 条评论,501人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VUE 钩子函数

    “Vue钩子函数就是指在一个Vue实例从创建到销毁的过程自动执行的函数。” 引用知乎 [SpiritTracks][] 作者的话 “ 就是在生命周期执行流程中预留的一个能让我

    相关 vue中钩子函数

    简单来说钩子函数是在系统消息触发时被系统调用的函数。不能自己触发。 vue的生命周期函数都是钩子函数 创建:异步请求适宜在created()调用 before

    相关 vue钩子函数

    `vue`钩子函数 > 虽然文档已经很详细啦,但是总结一下加深一下理解与记忆(以官方文档为参考整理的~) 1. 路由导航守卫 > 有时候,我们需要通过路由来进行一

    相关 JVM钩子函数

    虚拟机退出:JVM会在所有非后台线程关闭后才会退出,如在一个main线程里新产生一个线程,而该线程阻塞了,那么虚拟机不会退出。后台线程会在所有非后台线程退出后都停止任务。