OSTaskSwHook
Description
OSTaskSwHook()
is always called by either OSCtxSw()
or OSIntCtxSw()
(see os_cpu_a.asm
), just after saving the CPU registers onto the task being switched out. This hook function allows the port developer to perform additional operations (if needed) when µC/OS-III performs a context switch.
Before calling OSTaskSwHook()
, OSTCBCurPtr
points at the OS_TCB
of the task being switched out, and OSTCBHighRdyPtr
points at the OS_TCB
of the new task being switched in.
The code shown in the example below should be included in all implementations of OSTaskSwHook()
, and is used for performance measurements. This code is written in C for portability.
Files
os.h/os_cpu_c.c and os_app_hooks.c
Prototype
void OSTaskSwHook (void)
Arguments
None
Returned Values
None
Required Configuration
OS_CFG_APP_HOOKS_EN
must be enabled in os_cfg.h
. Refer to µC-OS-III Configuration Manual.
Callers
OSCtxSw()
and OSIntCtxSw()
.
Notes/Warnings
None
Example Usage
The code below calls an application specific hook that the application programmer can define. The user can simply set the value of OS_AppTaskSwHookPtr
to point to the desired hook function. When µC/OS-III performs a context switch, it calls OSTaskSwHook()
which in turn calls App_OS_TaskSwHook()
through OS_AppTaskSwHookPtr
.
void App_OS_TaskSwHook (void) /* os_app_hooks.c */ { /* Your code goes here! */ } void App_OS_SetAllHooks (void) /* os_app_hooks.c */ { CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); : OS_AppTaskSwHookPtr = App_OS_TaskSwHook; : CPU_CRITICAL_EXIT(); } void OSTaskSwHook (void) /* os_cpu_c.c */ { #if OS_CFG_TASK_PROFILE_EN > 0u CPU_TS ts; #endif #ifdef CPU_CFG_TIME_MEAS_INT_DIS_EN CPU_TS int_dis_time; #endif #if OS_CFG_APP_HOOKS_EN > 0u if (OS_AppTaskSwHookPtr != (OS_APP_HOOK_VOID)0) { (*OS_AppTaskSwHookPtr)(); } #endif #if OS_CFG_TASK_PROFILE_EN > 0u ts = OS_TS_GET(); if (OSTCBCurPtr != OSTCBHighRdyPtr) { OSTCBCurPtr->CyclesDelta = ts - OSTCBCurPtr->CyclesStart; OSTCBCurPtr->CyclesTotal += OSTCBCurPtr->CyclesDelta; } OSTCBHighRdyPtr->CyclesStart = ts; #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN int_dis_time = CPU_IntDisMeasMaxCurReset(); if (int_dis_time > OSTCBCurPtr->IntDisTimeMax) { OSTCBCurPtr->IntDisTimeMax = int_dis_time; } #endif #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u if (OSTCBCurPtr->SchedLockTimeMax < OSSchedLockTimeMaxCur) { OSTCBCurPtr->SchedLockTimeMax = OSSchedLockTimeMaxCur; } OSSchedLockTimeMaxCur = (CPU_TS)0; #endif #if (OS_CFG_TASK_STK_REDZONE_EN == DEF_ENABLED) stk_status = OSTaskStkRedzoneChk(DEF_NULL); if (stk_status != DEF_OK) { OSRedzoneHitHook(OSTCBCurPtr); } #endif }