916|1

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

《嵌入式软件的时间分析》从书中到实践-Tracealyzer目标代码程序框架和数据发送优化 [复制链接]

本帖最后由 qinyunti 于 2024-6-23 16:25 编辑

书中分享了很多理论,方法和案例,

基于本书,本人在此基础上再分享一些更贴近实战的案例分享。

详细可关注本人公众号 qinyunti

 

一. 前言

前面我们体验了Tracealyzer的代码移植和上位机使用,继续来分析下Tracealyzer的目标代码的框架和数据流,以及对数据传输进行优化。

二. 系统框图

系统框图如下:

 

 

 

2.1初始化

初始化的而一般流程如下

1.在所有RTOS的API之前,必要的硬件初始化之后调用xTraceInitialize进行初始化。因为要记录系统API的事件所以必须在其前。

2.RTOS内核启动

3.RTOS内核启动之后,调用xTraceEnable启动记录,xTraceEnable有三个种参数,

TRC_START_FROM_HOST不阻塞,等后续主机发启动命令;

TRC_START 立即启动;

TRC_START_AWAIT_HOST阻塞,等主机发启动命令;

其中TRC_START适合上位机已经准备好,下位机这边可以直接开始发送数据;

TRC_START_AWAIT_HOST和TRC_START_FROM_HOST适合,下位机先缓存数据,等到上位机发送命令启动传输。

xTraceEnable时也会调用xTraceInitialize,如果之前没有初始化此时再初始化以下

xTraceKernelPortEnable会调用xTraceHeapCreate和xTaskCreate,后者创建任务TzCtrl,

正是任务TzCtrl完成缓存区数据发送到上位机的处理过程。

xTraceInitialize初始化分配全局变量pxTraceRecorderData(动态或者静态分配),所有相关信息都是存在这个大的变量里,再调用各个模块的初始化函数进行初始化。

 

 

2.2数据流

RTOS中trace开头的事件回调接口(trcKernelPort.h中实现),记录事件到pxTraceRecorderData->xEventDataBuffer中,然后调用xTraceEventEnd最终调用xTraceInternalEventBufferPush将事件信息转写入xStreamPortBuffer。

最终任务TzCtrl不断查询xStreamPortBuffer,如果有数据待发送则发送到上位机,同时该任务调用读数据接口读命令,进行启动停止控制。

所以核心是缓冲区,有一个全局指针pxInternalEventBuffer指向pxTraceRecorderData->xStreamPortBuffer,

在xTraceStreamPortInitialize(&pxTraceRecorderData->xStreamPortBuffer)时初始化。

 

 

 

三. 发送优化

Live Stream窗口可以看到实时传输速率,可事件速率,如果有事件丢失,就需要优化传输。

 

 

从前面的框图可以看出,整个数据流的核心是缓存xStreamPortBuffer,

事件接口往该缓存写数据,任务TzCtrl从该缓存区取数发送。所以要优化发送都是围绕着该缓存来进行。

1.优化发送接口

一般需要70kB/S左右的传输速率,当然上报事件越多越频繁则相应的需要更快的传输速率。

如果使用串口,70kB/S大概需要70k*10=700K左右的波特率,一般1M左右的波特率是比较好的。最好使用硬件ping-pang FIFO操作或者使用ping-pang DMA操作,保证能按照硬件最大速率流式不间断传输。

2.增加缓存大小

修改trcStreamPortConfig.h宏TRC_CFG_STREAM_PORT_INTERNAL_BUFFER_SIZE的大小,

#define TRC_CFG_STREAM_PORT_INTERNAL_BUFFER_SIZE 20480

缓存只能均衡速度的波动,硬件的平均发送速度还是必须要满足需要发送的数据的速率的,否则最终怎么缓存最终还是会丢数据。此时就需要优化硬件发送接口或者减少发送事件量。

3.减小任务发送间隔提高发送任务优先级

TzCtrl任务处理完一次后会演示TRC_CFG_CTRL_TASK_DELAY,可以减小该宏的值,这样加快发送处理频率。甚至可以提高该任务的优先级TRC_CFG_CTRL_TASK_PRIORITY,但是不建议这么做,因为可能会影响其他正常任务的调度。

4.只发送关心的事件

比如只关系调度事件可以设置以下宏为1,这样只发送调度事件,事件量大大减小

#define TRC_CFG_SCHEDULING_ONLY 1

trcConfig.h中以下宏可以是否使能对应的事件上报,不关心的可以不使能

TRC_CFG_INCLUDE_xxxx_EVENTS

trcKernelPortConfig.h中以下宏可以是否使能对应的事件上报,不关心的可以不使能TRC_CFG_INCLUDE_xxxx_EVENTS

5.非必要实时发送数据,分开发送

在报告栈信息时xTraceStackMonitorReport,可以配置TRC_CFG_STACK_MONITOR_MAX_REPORTS宏为1,则一次TzCtrl循环只报告一个任务的信息,而不是一次报告所有任务的信息,因为栈可以不需要那么快的报告。

四. 总结

文本分享了Tracealyzer的整体结构和数据流,从整体上有了个了解, 并且分享了优化数据发送的一些关键点。后面再继续分享下其HEAD信息,命令,事件数据的存储方式。最后分享一些事件案例。

 

此帖出自汽车电子论坛

最新回复

大佬学习可认真了,配合实际的操作,这样的学习方法比较有效果。   详情 回复 发表于 2024-6-24 07:32
点赞 关注

回复
举报

7063

帖子

11

TA的资源

版主

沙发
 

大佬学习可认真了,配合实际的操作,这样的学习方法比较有效果。

此帖出自汽车电子论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表