查看: 514|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 14:34
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2021-1-21 14:18:10 | 显示全部楼层 |阅读模式
    分享到:
    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 7.jpg
    本文仅以一个简单的示例介绍了Tracealyzer在RTOS应用程序开发过程中的作用。

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-10-18 18:25 , Processed in 0.130098 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.