Tracealyzer自动分析并可视化RTOS的行为,对软件开发者来说,可视化分析是很大的一个改进。但是,对于一些不是RTOS自动生成的事件,或者说如果你想要可视化一些应用程序数据,测量两个事件之间的时间或监视应用程序中的状态机的行为,该怎么办呢?
本文研究如何在FreeRTOS记录这样的自定义信息,并使用Tracealyzer查看。注意,这里假定已经在FreeRTOS中完成了Tracealyzer跟踪记录器库的集成。 可视化特定应用程序的自定义信息的第一步是创建一个用户事件通道。这是一个字符串输出通道,允许开发人员添加自己的自定义事件,在Tracealyzer中称为用户事件。例如,如果想要传输传感器事件数据,将首先使用以下代码创建一个通道: traceString MyChannel = xTraceRegisterString(“DataChannel”); 此函数注册一个名为“DataChannel”的用户事件通道,记录在跟踪事件中,“MyChannel”相当于是这个通道的句柄。Tracealyzer在筛选面板中会显示此通道的复选框,因此可以很方便的启用/禁用这些事件的显示。接下来,可以使用vTracePrint()或vTracePrintF()函数来输出事件数据。可以使用vTracePrint传输固定字符串消息,如下所示: vTracePrint(MyChannel, “Button Pressed!”); 注意,将通道作为第一个参数,字符串作为第二个参数。如果我们想要记录变量事件数据,比如传感器数据的变化,可以使用vTracePrintF()函数,如下所示: vTracePrintF(MyChannel, “Sensor Data = %d”, SensorData); 虽然格式说明符(%d等)与经典的printf函数非常相似,但vTracePrintF是单独的实现,大多数繁重的工作都是在Tracealyzer的主机端的应用程序中完成,它还不支持所有的“printf”选项。具体信息可以在Tracealyzer用户手册和trcRecorder.h中找到。 一旦设置了用户事件跟踪,我们就可以从应用程序代码中记录包含FreeRTOS事件和用户事件的跟踪。例如,如果从一个按键(PB_Tx_1, PB_Tx_2)记录事件以及发送和接收事件(Tx, Rx),以了解系统时序,可以过滤用户事件,可能会看到如下内容。
通过vTracePrint或vTracePrintF记录用户事件通常比传统的printf快得多,因为真正的格式化是在主机端Tracealyzer软件中完成的,而不是在目标系统运行时。而且,vTracePrint比vTracePrintF更快,因为后者需要扫描字符串来计算参数的数量。这需要更多的时钟周期,但这也是可视化系统数据的好办法。例如,如果有一个正在采样传感器的ADC,我希望看到数据在一段时间内上升,可以记录传感器数据,然后使用用户事件信号图进行绘制,所需要做的就是运行系统并打开用户事件信号图:
建立了用户事件通道,我们就可以考虑事件之间的时间(在Tracealyzer中称为间隔)。间隔表示跟踪中任意两个事件之间的时间,例如按键按下和按键释放。可以为任何类型的事件定义间隔,无论我们决定使用内核事件(如释放或获取信号量)还是用户事件(如刚才定义的事件)。间隔对于理解系统中的重要事件非常有用,例如:
|