上一篇 | 返回主目录 | 下一篇
AutosarOS:任务执行时间与负载率(5)
1 基本概念及原理1.1 负载率概念1.2 时间统计方式1.3 任务占用统计方式2 功能函数执行时间测试2.1 绝对执行时2.2 相对执行时间2.3 中断对执行时间影响 3 执行周期测试4 负载率测试4.1 负载率计算方式4.2 任务/函数负载率评估在条件有限的情况下,如何采用通过现有的调试工具获取函数执行时间、任务执行周期以及负载率的测试等。
#在条件宽裕的情况下,购买第三方工具自然对于测试执行时间以及负载率等极为方便,建议采用此种方式
1 基本概念及原理
1.1 负载率概念
负载率 = 占用时间 /(占用时间 + 空闲时间)
#简单来说,就是工作时间占用总时间的比例,比如说你需要工作12小时,就可以说你负载率为50%。这可量化反映当前使用情况
从上面可以看出来计算负载率,需要解决两个问题:
1)、必须可量化得获取占用时间
2)、得存在可靠的计时方式
1.2 时间统计方式
时间统计要求准确,因此对于我们来说,比较合适的就是硬件定时器里面计数(如英飞凌中的STM、ATOM等)。
#建议直接从相关定时器计数的寄存器地址获取,切记不可使用软件定时器
1.3 任务占用统计方式
在任务执行过程中,会存在任务切换(中断打断任务等),因此直接在任务开始处与结束的位置来表示开始与结束会造成实际执行时间大于任务实际执行时间。、
可以参考下“AutosarOS:错误处理、跟踪与调试(博文)”定义,在任务切换(上下文切换)时,可以进入PreTaskHook、PostTaskHook,因此在此Hook函数中进行处理,可以通过处理得到准确的Task执行时间。
2 功能函数执行时间测试
对于具体的功能执行时间存在以下几方面问题:
1)、无法找到进入或者退出时间点(中断对其时间测量不可忽视)
2)、需要评估执行时间相对于所在任务可用的时间片的占比(调度表形式调用)
#以时间片形式进行处理时,需要保障该任务存在偏移在一定范围内(确保不会触发时间保护),因此也需要确保单个任务的负载率控制在一定范围
2.1 绝对执行时
绝对执行时间 = 执行结束时间 - 执行开始时间
该参数反映了该功能函数的绝对执行时间,可用于该函数在进行任务分配时的依据。
同时需要注意两方面问题:
1)、禁用中断进行测试,避免中断对测试结果影响
2)、被分配任务的周期(对整体负载率影响与周期成倍数关系)
#注意定时器位数,溢出时需要特殊处理(切记计数时需要处理此类情况)
2.2 相对执行时间
相对执行时间 = 功能函数执行时间 / 任务时间片时间
相对执行时间反映了功能函数执行时间占用任务的可用时间比例,可作为任务执行时间优化的重要依据(以上针对的是调度表存在时间片的情况下)
2.3 中断对执行时间影响
在测试过程中或者真实工况条件下,由于通信、ADC采集、定时器等可能产生的中断影响,函数/任务实际执行时间应大于真实执行时间。
函数执行时间 = 中断执行时间 + 函数真实执行时间
#因此为了正确准确评价函数执行时间可在执行过程中屏蔽中断“EnableAllInterrupts/ DisableAllInterrupts”,具体可参考AutosarOS:操作系统基本概念
3 执行周期测试
任务执行时间 = 本次任务执行时间时间计数 - 上次任务执行时间时间计数
首先说下周期偏移带来的常见影响:
1)、窗狗喂狗超时或者过早,导致软件复位
2)、通信周期波动较大(如CAN的周期报文)
#须对周期比较敏感的任务进行周期测试,记录周期偏移最大值,评估周期偏移是否在可接受范围内以及是否会带来软件bug(如复位、报文超时、甚至某些逻辑未执行等等)
4 负载率测试
4.1 负载率计算方式
负载率 = 执行任务时间 / (执行任务时间 + 空闲时间)
#注意事项:
1)、可选择一段时间为计时周期,如2s或者更高(最好为周期任务最小公倍数的倍数)
2)、执行时间为此段时间内所有任务执行时间的总和
4.2 任务/函数负载率评估
函数负载率贡献 = 函数执行时间 / 函数执行周期
#注意事项:
1)、负载率为所有函数负载率贡献之和
2)、注意在函数中存在函数周期倍数的执行方式,周期不应以函数为其为准,应该以里面调用的函数的最大周期作为该函数的周期
之前写的文档丢了,这次凭印象只写了大概,大家见谅。后续想起来了在进行补充,有时间把相关的代码也可以进行补充下
上一篇 | 返回主目录 | 下一篇