task jitter计算方法
PerfCalc 任务性能监控钩子函数说明概述本文档详细说明PerfCalc_PreTaskHook和PerfCalc_PostTaskHook两个 AUTOSAR OS 钩子函数的实现原理、功能和使用方法。PerfCalc_PreTaskHook功能说明在任务进入/激活前被 OS 调用用于记录任务开始时间计算任务周期 (Period)计算任务抖动 (Jitter)嵌入式追踪记录调用时机任务激活/切换 ↓ PreTaskHook() ← 在这里执行 ↓ 任务体执行核心代码流程FUNC(void,PERFCALC_CODE)PerfCalc_PreTaskHook(void){/* 1. 获取当前核心信息 */ptrCorePerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];/* 2. 获取当前任务 */GetTaskID(lRunningTask);lRunningTask_IndexOS_TASKTYPE_TO_INDEX(lRunningTask);lRunningTask_CoreIdOS_TASKTYPE_TO_COREID(lRunningTask);/* 3. 读取时间戳 */lTimeSystemTime_Read_us_32bits();/* 4. 嵌入式追踪 */#if(PERFCALC_EMBDTRACE_ENABLEDSTD_ON)/* 记录任务进入事件 */#endif/* 5. CPU 负载计算 */#if(PERFCALC_CPU_LOAD_ENABLEDSTD_ON)if(lRunningTask_IndexptrTask-idle){ptrCore-TimeStampEnterTasklTime;}#endif/* 6. 任务负载计算 (核心功能) */#if(PERFCALC_TASK_LOAD_ENABLEDSTD_ON)ptrCore-TaskLoad_PreTaskTimeStamplTime;if(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index]!0u){if(ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index]!0u){/* 计算周期 */lRunningTask_PeriodPERFCALC_GET_DT(ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 计算抖动 */lRunningTask_JitterPERFCALC_GET_JITTER(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index],lRunningTask_Period);/* 更新统计 */UpdatePeriodStats(lRunningTask_Index,lRunningTask_Period);UpdateJitterStats(lRunningTask_Index,lRunningTask_Jitter);}ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index]lTime;}#endif}Jitter 计算详解计算公式实际周期 当前时间 - 上次进入时间 Jitter |实际周期 - 预期周期|代码实现/* 步骤 1: 计算实际周期 */lRunningTask_PeriodPERFCALC_GET_DT(ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 步骤 2: 计算抖动 */lRunningTask_JitterPERFCALC_GET_JITTER(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index],/* 预期周期 */lRunningTask_Period);/* 实际周期 */宏定义/* 时间差计算 (处理溢出) */#definePERFCALC_GET_DT(start,stop)\((stop)(start))?((stop)-(start)):((start)-(stop))/* Jitter 计算 */#definePERFCALC_GET_JITTER(expected,actual)\((actual)(expected))?((actual)-(expected)):((expected)-(actual))PerfCalc_PostTaskHook功能说明在任务结束后被 OS 调用用于记录任务执行时间 (Duration)检测任务超时计算 CPU 负载嵌入式追踪记录调用时机任务体执行 ↓ PostTaskHook() ← 在这里执行 ↓ 任务切换/等待核心代码流程FUNC(void,PERFCALC_CODE)PerfCalc_PostTaskHook(void){/* 1. 获取当前核心信息 */ptrCorePerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];/* 2. 获取当前任务 */GetTaskID(lRunningTask);lRunningTask_IndexOS_TASKTYPE_TO_INDEX(lRunningTask);/* 3. 读取时间戳 */lTimeSystemTime_Read_us_32bits();/* 4. 嵌入式追踪 */#if(PERFCALC_EMBDTRACE_ENABLEDSTD_ON)if(lRunningTask_Index!ptrTask-idle){PERFCALC_STORETASK(ptrCore,lRunningTask_Index,lTime);}#endif/* 5. CPU 负载计算 */#if(PERFCALC_CPU_LOAD_ENABLEDSTD_ON)if(lRunningTask_IndexptrTask-idle){ptrCore-TimeSpentIdlePERFCALC_GET_DT(ptrCore-TimeStampEnterTask,lTime);}#endif/* 6. 任务执行时间计算 (核心功能) */#if(PERFCALC_TASK_LOAD_ENABLEDSTD_ON)ptrCore-TaskLoad_SumValues[lRunningTask_Index]PERFCALC_GET_DT(ptrCore-TaskLoad_PreTaskTimeStamp,lTime);if(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index]!0u){/* 计算执行时间 */lRunningTask_DurationPERFCALC_GET_DT(ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 更新统计 */UpdateDurationStats(lRunningTask_Index,lRunningTask_Duration);/* 检测超时 */if(lRunningTask_DurationTaskDuration_Threshold){Reset_LogPutAnormalTask(lRunningTask_Index,lRunningTask_Duration);}}#endif}执行时间计算Duration PostTaskHook时间 - PreTaskHook时间 任务实际执行时间两个钩子的协作关系时间轴图示时间轴: ─────────────────────────────────────────────────────────► T0 T1 T2 T3 │ │ │ │ ▼ ▼ ▼ ▼ PreTaskHook │ PostTaskHook PreTaskHook (记录T0) │ (记录T2) (记录T3) │ │ │ 任务执行 任务结束 下次激活 │ │ └───────────────┘ Duration T2 - T1 Period T3 - T1 (两次激活间隔) Jitter |Period - 预期周期|数据流┌─────────────────┐ │ PreTaskHook │ │ - 记录开始时间 │ │ - 计算Period │ │ - 计算Jitter │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 任务执行 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ PostTaskHook │ │ - 记录结束时间 │ │ - 计算Duration │ │ - 检测超时 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 统计数据 │ │ - Avg/Max Period│ │ - Avg/Max Jitter│ │ - Avg/Max Dur │ │ - CPU Load │ └─────────────────┘统计数据结构核心数据结构typedefstruct{/* 周期统计 */uint32 TaskPeriod_SumValues[PERFCALC_NR_OF_TASKS];uint32 TaskPeriod_MaxValues[PERFCALC_NR_OF_TASKS];uint16 TaskPeriod_SampleIndex[PERFCALC_NR_OF_TASKS];/* Jitter 统计 */uint32 TaskJitter_SumValues[PERFCALC_NR_OF_TASKS];uint32 TaskJitter_MaxValues[PERFCALC_NR_OF_TASKS];uint16 TaskJitter_SampleIndex[PERFCALC_NR_OF_TASKS];/* 执行时间统计 */uint32 TaskDuration_SumValues[PERFCALC_NR_OF_TASKS];uint32 TaskDuration_MaxValues[PERFCALC_NR_OF_TASKS];uint16 TaskDuration_SampleIndex[PERFCALC_NR_OF_TASKS];/* 时间戳 */uint32 TaskLoad_EnterTimeStamp[PERFCALC_NR_OF_TASKS];uint32 TaskLoad_PreTaskTimeStamp;/* CPU 负载 */uint32 TimeStampEnterTask;uint32 TimeSpentIdle;/* 嵌入式追踪 */uint32 EmbdTrace_TimeStampEnterTask;uint32 EmbdTrace_TimeISRDuringTask;uint32 lastRunningTaskIndex;}PerfCalc_CoreDynamicInfoType;统计数据用途统计数据计算方法用途Avg PeriodSum / Count验证任务周期配置Max Period峰值记录检测任务响应延迟Avg JitterSum / Count评估系统实时性Max Jitter峰值记录最坏情况分析Avg DurationSum / Count任务执行时间基线Max Duration峰值记录WCET 分析CPU LoadIdle时间占比系统负载监控配置选项Tresos 配置/* 功能开关 */PERFCALC_EMBDTRACE_ENABLED/* 嵌入式追踪 */PERFCALC_CPU_LOAD_ENABLED/* CPU 负载计算 */PERFCALC_TASK_LOAD_ENABLED/* 任务负载计算 *//* 任务配置 */PERFCALC_NR_OF_TASKS/* 任务数量 */PERFCALC_TASK_PERIOD_STD/* 任务预期周期 */TaskDuration_Threshold/* 任务超时阈值 */配置示例/* Task0: 10ms 周期任务 */#defineTASK0_PERIOD_US10000#defineTASK0_THRESHOLD_US5000/* 超时阈值 5ms *//* Task1: 20ms 周期任务 */#defineTASK1_PERIOD_US20000#defineTASK1_THRESHOLD_US10000/* 超时阈值 10ms */使用示例读取任务统计voidReadTaskStats(uint8 taskId,TaskStatsType*stats){PerfCalc_CoreDynamicInfoType*ptrCorePerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];uint16 sampleCountptrCore-TaskPeriod_SampleIndex[taskId];if(sampleCount0){stats-avgPeriodptrCore-TaskPeriod_SumValues[taskId]/sampleCount;stats-maxPeriodptrCore-TaskPeriod_MaxValues[taskId];stats-avgJitterptrCore-TaskJitter_SumValues[taskId]/sampleCount;stats-maxJitterptrCore-TaskJitter_MaxValues[taskId];stats-avgDurationptrCore-TaskDuration_SumValues[taskId]/sampleCount;stats-maxDurationptrCore-TaskDuration_MaxValues[taskId];}}系统健康检查booleanSystem_HealthCheck(void){for(uint8 i0;iPERFCALC_NR_OF_TASKS;i){uint32 maxJitterPerfCalc_CoreDynamicInfo[0].TaskJitter_MaxValues[i];uint32 expectedPeriodPerfCalc_TaskPeriod_StdValues[i];/* Jitter 超过 20% 视为异常 */if(maxJitterexpectedPeriod/5){returnFALSE;}}returnTRUE;}注意事项1. 钩子调用顺序voidPreTaskHook(void){/* PerfCalc 必须在其他钩子之后调用 */OtherHooks_PreTaskHook();PerfCalc_PreTaskHook();/* 最后调用 */}voidPostTaskHook(void){/* PerfCalc 必须在其他钩子之前调用 */PerfCalc_PostTaskHook();/* 首先调用 */OtherHooks_PostTaskHook();}2. 时间戳精度使用SystemTime_Read_us_32bits()获取微秒级时间戳注意处理计时器溢出PERFCALC_GET_DT宏已处理3. 多核系统/* 每个核心独立统计 */PerfCalc_CoreDynamicInfoType*ptrCorePerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];4. 首次激活/* 首次激活时 EnterTimeStamp 为 0不计算 Period 和 Jitter */if(ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index]!0u){/* 计算 Period 和 Jitter */}相关文件文件说明PerfCalc.c核心实现PerfCalc.h头文件PerfCalc_Cfg.h配置文件PerfCalc_MemMap.h内存映射版本历史版本日期修改内容1.02026初始版本参考文档AUTOSAR OS SpecificationRTA-OS User GuideTraveo II Technical Reference Manual