当前位置: 首页 > news >正文

task jitter计算方法

PerfCalc 任务性能监控钩子函数说明

概述

本文档详细说明PerfCalc_PreTaskHookPerfCalc_PostTaskHook两个 AUTOSAR OS 钩子函数的实现原理、功能和使用方法。

PerfCalc_PreTaskHook

功能说明

任务进入/激活前被 OS 调用,用于:

  • 记录任务开始时间
  • 计算任务周期 (Period)
  • 计算任务抖动 (Jitter)
  • 嵌入式追踪记录

调用时机

任务激活/切换 ↓ PreTaskHook() ← 在这里执行 ↓ 任务体执行

核心代码流程

FUNC(void,PERFCALC_CODE)PerfCalc_PreTaskHook(void){/* 1. 获取当前核心信息 */ptrCore=PerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];/* 2. 获取当前任务 */GetTaskID(&lRunningTask);lRunningTask_Index=OS_TASKTYPE_TO_INDEX(lRunningTask);lRunningTask_CoreId=OS_TASKTYPE_TO_COREID(lRunningTask);/* 3. 读取时间戳 */lTime=SystemTime_Read_us_32bits();/* 4. 嵌入式追踪 */#if(PERFCALC_EMBDTRACE_ENABLED==STD_ON)/* 记录任务进入事件 */#endif/* 5. CPU 负载计算 */#if(PERFCALC_CPU_LOAD_ENABLED==STD_ON)if(lRunningTask_Index==ptrTask->idle){ptrCore->TimeStampEnterTask=lTime;}#endif/* 6. 任务负载计算 (核心功能) */#if(PERFCALC_TASK_LOAD_ENABLED==STD_ON)ptrCore->TaskLoad_PreTaskTimeStamp=lTime;if(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index]!=0u){if(ptrCore->TaskLoad_EnterTimeStamp[lRunningTask_Index]!=0u){/* 计算周期 */lRunningTask_Period=PERFCALC_GET_DT(ptrCore->TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 计算抖动 */lRunningTask_Jitter=PERFCALC_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_Period=PERFCALC_GET_DT(ptrCore->TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 步骤 2: 计算抖动 */lRunningTask_Jitter=PERFCALC_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. 获取当前核心信息 */ptrCore=PerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];/* 2. 获取当前任务 */GetTaskID(&lRunningTask);lRunningTask_Index=OS_TASKTYPE_TO_INDEX(lRunningTask);/* 3. 读取时间戳 */lTime=SystemTime_Read_us_32bits();/* 4. 嵌入式追踪 */#if(PERFCALC_EMBDTRACE_ENABLED==STD_ON)if(lRunningTask_Index!=ptrTask->idle){PERFCALC_STORETASK(ptrCore,lRunningTask_Index,lTime);}#endif/* 5. CPU 负载计算 */#if(PERFCALC_CPU_LOAD_ENABLED==STD_ON)if(lRunningTask_Index==ptrTask->idle){ptrCore->TimeSpentIdle+=PERFCALC_GET_DT(ptrCore->TimeStampEnterTask,lTime);}#endif/* 6. 任务执行时间计算 (核心功能) */#if(PERFCALC_TASK_LOAD_ENABLED==STD_ON)ptrCore->TaskLoad_SumValues[lRunningTask_Index]+=PERFCALC_GET_DT(ptrCore->TaskLoad_PreTaskTimeStamp,lTime);if(PerfCalc_TaskPeriod_StdValues[lRunningTask_Index]!=0u){/* 计算执行时间 */lRunningTask_Duration=PERFCALC_GET_DT(ptrCore->TaskLoad_EnterTimeStamp[lRunningTask_Index],lTime);/* 更新统计 */UpdateDurationStats(lRunningTask_Index,lRunningTask_Duration);/* 检测超时 */if(lRunningTask_Duration>=TaskDuration_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*ptrCore=PerfCalc_CoreDynamicInfo[PerfCalc_GetCoreID()];uint16 sampleCount=ptrCore->TaskPeriod_SampleIndex[taskId];if(sampleCount>0){stats->avgPeriod=ptrCore->TaskPeriod_SumValues[taskId]/sampleCount;stats->maxPeriod=ptrCore->TaskPeriod_MaxValues[taskId];stats->avgJitter=ptrCore->TaskJitter_SumValues[taskId]/sampleCount;stats->maxJitter=ptrCore->TaskJitter_MaxValues[taskId];stats->avgDuration=ptrCore->TaskDuration_SumValues[taskId]/sampleCount;stats->maxDuration=ptrCore->TaskDuration_MaxValues[taskId];}}

系统健康检查

booleanSystem_HealthCheck(void){for(uint8 i=0;i<PERFCALC_NR_OF_TASKS;i++){uint32 maxJitter=PerfCalc_CoreDynamicInfo[0].TaskJitter_MaxValues[i];uint32 expectedPeriod=PerfCalc_TaskPeriod_StdValues[i];/* Jitter 超过 20% 视为异常 */if(maxJitter>expectedPeriod/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*ptrCore=PerfCalc_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 Specification
  • RTA-OS User Guide
  • Traveo II Technical Reference Manual
http://www.jsqmd.com/news/587752/

相关文章:

  • 告别繁琐安装:用快马平台在线环境,三步创建你的第一个网页应用
  • 【ESP32-S3 深度实战】从小智AI底层移植到自定义LVGL表情:M5Stack CoreS3 避坑与架构指南
  • 硬件笔记——立创逻辑派开关电源案例解读
  • 零基础学Java:用快马AI生成你的第一个集合与对象管理程序
  • 提升开发效率:用快马一键生成智能排序工具模块
  • PE结构 ---> 9.RvaToFoa 内存状体到文件状态
  • 如何用PHP实现线程安全的单例模式?
  • 《黄金周人山人海,节后门可罗雀——景区怎么把这个差距缩小?》
  • 3种突破:ctfileGet如何解除城通网盘限速枷锁
  • 快马平台快速构建mysql博客系统原型:十分钟搞定数据库与api
  • Oracle EBS 资产类别是 真正的树形层级结构(通过弹性域实现父子关系),而 SAP 资产类别(Asset Class)是 扁平结构(无系统内置层级)
  • 飞牛openclaw使用指南(免费模型,不消耗token,响应快,无qps限制,无限使用!!)
  • 实战指南:基于快马生成openclaw千问的智能文档问答系统完整项目
  • 番茄小说下载器:3分钟搭建你的个人离线图书馆完整指南
  • 面试“逆袭率”第一的秘密:让我为你细细阐述
  • Oracle EBS和SAP在资产类别层级关系上的差异
  • 【小兔鲜电商前台 | 项目笔记】第三天
  • 在Windows系统下使用fastboot命令
  • 【SMPL-X】AMASS动捕数据集与SMPL格式概述
  • 房屋建筑学——变形缝
  • Flink 个人学习实时数据管道框架--2 技术架构设计
  • 简单工厂、工厂方法、抽象工厂的PHP代码区别?
  • LLM 怎么生成回答?揭秘“思考“过程
  • Phi-4-mini-reasoning作品集:离散数学归纳法严谨性验证生成案例
  • OpenClaw人人养虾:后台执行
  • MySQL函数及条件查询相关用法
  • 2025_NIPS_Fast Monte Carlo Tree Diffusion: 100× Speedup via Parallel Sparse Planning
  • AI赋能论文研究:调用快马平台模型智能分析文本与提取关键词
  • OpenClaw多终端控制:千问3.5-9B实现跨设备协同
  • DREAM3D:革新材料科学数据处理的开源框架