Tracealyzer是一款RTOS行为分析工具,支持包括VxWorks、μC/OS-III、FreeRTOS在内的众多RTOS,以及Linux系统。
在Tracealyzer视图中, Instance实例为Actor的一次执行,在时间轴视图上以带颜色的矩形表示,矩形的长度代表着执行的时间长度。
(Actor参与者被定义为任务/线程或者ISR。每个任务在Tracealyzer中对应不同颜色的矩形。基本概念的定义可以参考往期文章:RTOS分析需掌握的基本概念
图1中,矩形中的阴影部分表示该任务处于就绪态,但是当前CPU正被就绪的更高优先级任务占用。
图1
由于低优先级的任务可能被高优先级的任务抢占,任务在执行过程中可能会调用vTaskDelay函数主动放弃CPU等,因此任务的一次完整执行过程可能会被划分为多个实例Instance,即会存在多个矩形块,如图2所示。
图2
Tracealyzer在任务执行过程中,如何划分实例呢?
当任务中出现如下函数调用或者事件时,被认为是一个实例的完成,即该任务的一次执行过程结束。
• 任务中调用vTaskDelay函数
• 调用系统阻塞函数(包括阻塞等待信号量或其他事件)
根据上述默认规则,大多数任务都能够被划分为多个实例以进行统计和分析。但如果任务中没有使用到上述函数调用时,则该任务将无法被自动划分成为多个实例。
在很长一段时间内,该任务的所有执行过程会被视为同一个实例Instance,则该实例的统计结果会是任务多次重复执行后的结果。而这样的统计信息不是我们所想要的,通常我们更关注的是任务单次执行的时候的统计信息。
图3所示vTaskConsumer任务中,使用的是非阻塞信号量接收函数,也没有调用vTaskDelay函数,没有实例完成条件,因此该任务的执行过程一直被视为处于在同一个实例中,表现为在同一个蓝色的矩形框内,见图4。
图3
图4
为了解决上述问题,Tracealyzer提供了API函数vTraceInstanceFinishedNow()来允许用户手动控制任务的实例完成条件,从而能够将循环执行的任务手动分组为多个实例。该函数被调用位置代表前一个实例已经完成,任务的后续执行过程则会被视为一个新的实例。
图5
在任务执行的末尾手动调用该函数,见图5,从而将任务的一次执行过程手动分组为一个实例(图6),方便通过实例的统计信息来对任务进行分析。任务一段时间内的循环执行过程被分组成为了多个单次执行的实例,方便我们对问题进行分析。
图6
分组后可以得到该任务的单次执行时间为418毫秒906微秒,见图7。
图7