Percepio公司的Tracealyzer是业界领先的RTOS可视化跟踪工具,可以用来辅助RTOS应用程序开发,捕获依靠单独的源代码分析无法发现的问题。目前Tracealyzer提供了30多种相互关联的运行时行为视图,包括任务调度、中断、任务之间的相互作用,以及从应用程序代码中记录的用户事件。Tracealyzer作为传统调试的补充,提供更高层次的调试视图,非常适合理解典型的实时问题。Tracealyzer对系统运行时的行为提供了前所未有的洞察方法。帮助开发人员加快固件的开发,减少对系统验证和性能优化所需要的时间。
下面以一个简单的应用程序问题来演示Tracealyzer如何辅助解决RTOS应用程序中的串口输出错误。
如下图所示,在一个任务Task中间通过串口输出一串固定的字符串,但在运行过程中发现某一个时刻输出的字符串数据出现了错误。字符串内容输出到一半时输出内容发生了改变。 那么此时如何判断是什么原因导致数据输出错误呢?可以看到大多数情况下输出均是正常的,只有偶尔的时刻输出异常,如何找到这类问题的原因呢?若仅仅是分析源码,大多数情形下输出是正常的,说明UART串口输出函数本身是正常的。这类偶发性问题通常难以定位原因。
此时可以借助Tracealyzer来分析该问题,首先我们需要在该串口输出函数_write中添加一个语句vTracePrint(UART_EVENTS,buffer)来使Tracealyzer能够对串口输出这一用户事件进行跟踪记录。
进一步分析右侧的任务调度视图,我们可以发现,在黄色矩形块代表的Task1的执行过程中,高优先级的Task2抢占了Task1任务的运行,导致Task1任务串口输出尚未完成时即停止了运行,Task2的输出替换了Task1的输出,这也就解释了最开始的串口输出异常。
导致上面问题的原因是仅存在一个串口输出,而Task1和Task2对这个资源进行了抢夺。那么如何解决上面的问题呢?我们可以对这个资源创建一个互斥信号量来进行管理,Task1和Task2只有在获得该互斥信号量的情况下,才能使用串口输出。
如下面的跟踪视图所示,Task1首先获得了互斥信号量UART_Mutex,Task 2抢占Task 1后也尝试去获取该互斥信号量,获取信号量失败而阻塞等待,Task1得以继续运行。当Task 1串口输出完成后释放互斥信号量,Task 2获得该互斥信号量后继续运行。
通过互斥信号量的使用,解决了上面的输出异常问题。
本文仅以一个简单的示例介绍了Tracealyzer在RTOS应用程序开发过程中的作用。
|