请选择 进入手机版 | 继续访问电脑版
搜索
查看: 504|回复: 0

[原创] 如何使用Tracealyzer解决串口输出异常?

[复制链接]

该用户从未签到

39

主题

173

帖子

2

蝴蝶豆

金牌会员

最后登录
2021-3-29
发表于 2021-1-21 13:54:09 | 显示全部楼层 |阅读模式
Percepio公司的Tracealyzer是业界领先的RTOS可视化跟踪工具,可以用来辅助RTOS应用程序开发,捕获依靠单独的源代码分析无法发现的问题。目前Tracealyzer提供了30多种相互关联的运行时行为视图,包括任务调度、中断、任务之间的相互作用,以及从应用程序代码中记录的用户事件。Tracealyzer作为传统调试的补充,提供更高层次的调试视图,非常适合理解典型的实时问题。Tracealyzer对系统运行时的行为提供了前所未有的洞察方法。帮助开发人员加快固件的开发,减少对系统验证和性能优化所需要的时间。
1.jpg
下面以一个简单的应用程序问题来演示Tracealyzer如何辅助解决RTOS应用程序中的串口输出错误。

如下图所示,在一个任务Task中间通过串口输出一串固定的字符串,但在运行过程中发现某一个时刻输出的字符串数据出现了错误。字符串内容输出到一半时输出内容发生了改变。
2.jpg
那么此时如何判断是什么原因导致数据输出错误呢?可以看到大多数情况下输出均是正常的,只有偶尔的时刻输出异常,如何找到这类问题的原因呢?若仅仅是分析源码,大多数情形下输出是正常的,说明UART串口输出函数本身是正常的。这类偶发性问题通常难以定位原因。

此时可以借助Tracealyzer来分析该问题,首先我们需要在该串口输出函数_write中添加一个语句vTracePrint(UART_EVENTS,buffer)来使Tracealyzer能够对串口输出这一用户事件进行跟踪记录。
3.jpg
进一步分析右侧的任务调度视图,我们可以发现,在黄色矩形块代表的Task1的执行过程中,高优先级的Task2抢占了Task1任务的运行,导致Task1任务串口输出尚未完成时即停止了运行,Task2的输出替换了Task1的输出,这也就解释了最开始的串口输出异常。
4.jpg
导致上面问题的原因是仅存在一个串口输出,而Task1和Task2对这个资源进行了抢夺。那么如何解决上面的问题呢?我们可以对这个资源创建一个互斥信号量来进行管理,Task1和Task2只有在获得该互斥信号量的情况下,才能使用串口输出。

如下面的跟踪视图所示,Task1首先获得了互斥信号量UART_Mutex,Task 2抢占Task 1后也尝试去获取该互斥信号量,获取信号量失败而阻塞等待,Task1得以继续运行。当Task 1串口输出完成后释放互斥信号量,Task 2获得该互斥信号量后继续运行。
5.jpg
通过互斥信号量的使用,解决了上面的输出异常问题。
6.jpg
本文仅以一个简单的示例介绍了Tracealyzer在RTOS应用程序开发过程中的作用。

Tracealyzer更多的功能介绍和申请评估请参考Percepio公司官网:
https://percepio.com/tracealyzer/

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 09:37 , Processed in 1.176968 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表