qinyunti 发表于 2024-6-23 16:08

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

<div class='showpostmsg'> 本帖最后由 qinyunti 于 2024-6-23 16:25 编辑

<p>书中分享了很多理论,方法和案例,</p>

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

<p>详细可关注本人公众号 qinyunti</p>

<div></div>

<p>&nbsp;</p>

<h1>一.&nbsp;<strong>前言</strong></h1>

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

<h1>二.&nbsp;<strong>系统框图</strong></h1>

<p>系统框图如下:</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<h2><strong>2.1初始化</strong></h2>

<p>初始化的而一般流程如下</p>

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

<p>2.RTOS内核启动</p>

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

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

<p>TRC_START 立即启动;</p>

<p>TRC_START_AWAIT_HOST阻塞,等主机发启动命令;</p>

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

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

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

<p>xTraceKernelPortEnable会调用xTraceHeapCreate和xTaskCreate,后者创建任务TzCtrl,</p>

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

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

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<h2><strong>2.2数据流</strong></h2>

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

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

<p>所以核心是缓冲区,有一个全局指针pxInternalEventBuffer指向pxTraceRecorderData-&gt;xStreamPortBuffer,</p>

<p>在xTraceStreamPortInitialize(&amp;pxTraceRecorderData-&gt;xStreamPortBuffer)时初始化。</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<h1>三.&nbsp;<strong>发送优化</strong></h1>

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

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

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

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

<p>1.优化发送接口</p>

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

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

<p>2.增加缓存大小</p>

<p>修改trcStreamPortConfig.h宏TRC_CFG_STREAM_PORT_INTERNAL_BUFFER_SIZE的大小,</p>

<p>#define TRC_CFG_STREAM_PORT_INTERNAL_BUFFER_SIZE 20480</p>

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

<p>3.减小任务发送间隔提高发送任务优先级</p>

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

<p>4.只发送关心的事件</p>

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

<p>#define TRC_CFG_SCHEDULING_ONLY&nbsp;1</p>

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

<p>TRC_CFG_INCLUDE_xxxx_EVENTS</p>

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

<p>5.非必要实时发送数据,分开发送</p>

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

<h1>四.&nbsp;<strong>总结</strong></h1>

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

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lugl4313820 发表于 2024-6-24 07:32

<p>大佬学习可认真了,配合实际的操作,这样的学习方法比较有效果。</p>
页: [1]
查看完整版本: 《嵌入式软件的时间分析》从书中到实践-Tracealyzer目标代码程序框架和数据发送优化