首页 > 代码库 > 使用 Codec Engine 的 API 函数(八)
使用 Codec Engine 的 API 函数(八)
本文翻译自TI的手册,该手册是学习GPP+DSP开发的金典文档,希望对各位入门有所帮助,有理解不当之处望请赐教。
Codec Engine Application Developer User‘s Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 应用开发使用手册》 http://blog.csdn.net/dyzok88/article/details/42154487
《第一章 Codec Engine 概要》 http://blog.csdn.net/dyzok88/article/details/42214813
《第二章 Codec Engine 安装和设置》 http://blog.csdn.net/dyzok88/article/details/42278109
《第三章 使用 Codec Engine 的示例应用程序》 http://blog.csdn.net/dyzok88/article/details/42302793
《第四章 使用 Codec Engine 的 API 函数 (一)》http://blog.csdn.net/dyzok88/article/details/42323123
《第四章 使用 Codec Engine 的 API 函数 (二)》http://blog.csdn.net/dyzok88/article/details/42324061
《第四章 使用 Codec Engine 的 API 函数 (三)》http://blog.csdn.net/dyzok88/article/details/42344661
《第四章 使用 Codec Engine 的 API 函数 (四)》http://blog.csdn.net/dyzok88/article/details/42353141
《第四章 使用 Codec Engine 的 API 函数 (五)》http://blog.csdn.net/dyzok88/article/details/42374715
《第四章 使用 Codec Engine 的 API 函数 (六)》http://blog.csdn.net/dyzok88/article/details/42342539
《第四章 使用 Codec Engine 的 API 函数 (七)》http://blog.csdn.net/dyzok88/article/details/42583837
// 正文
4.8 怎样使用软件跟踪调试?
用来帮助跟踪 Codec Engine 应用程序的软件的实用模块是 TraceUtil 模块,您可以使用此模块调试 and/or 收集实时数据。
此外,像 SoC 分析器工具可以用来帮助显示跟踪数据。TraceUtil 可用于简化使用这样的工具。
TraceUtil 允许您指定你想要跟踪的数量和收集的位置,如下所述:
1. At design time,通过设置配置文件属性
2. At start time,通过设置环境变量
3. At run-time,通过写命令字符串给命名的 UNIX 管道
TraceUtil 管理三种 Codec Engine 模块产生的记录( tracing ):
1. Tracing on the GPP side. 许多 Codec Engine 和 GPP-side 模块,丢掉描述自己的状态或警告和错误消息跟踪字符串。
2. Tracing on the DSP side. DSP-side 模块可以提供可以在 GPP-side 被 TraceUtil 模块收集的跟踪信息。
3. DSP/BIOS logging on the DSP side. DSP/BIOS 提供 TRC 和 LOG 模块,收集有关各种 DSP/BIOS 系统事件,如任务切换的信息,您可以使用 TraceUtil 模块进行 DSP/BIOS 远程跟踪。不像其他的跟踪记录是 ASCII 文本类型,DSP/BIOS 日志是一个二进制文件。
作为 TraceUtil 的补充,GPP 端代码也可以用 printf(),或者您也可以在 GPP 端代码使用 GNU 项目调试器( GDB )。
4.8.1 在设计时配置 TraceUtil
要启用 TraceUtil 模块,你必须将这行代码添加到您的 GPP 应用程序的配置( .cfg )脚本中,放在脚本中任何位置都可以。
var TraceUtil = xdc.useModule('ti.sdo.ce.utils.trace.TraceUtil');
默认 TraceUtil 设置导致 GPP 应用程序:
1. 打印所有 GPP 端错误和警告到标准输出。
2. 每200毫秒收集 DSP 端错误和警告,并将其打印到标准输出。
3. 未启用或捕捉任何 DSP/BIOS 记录。
提供常量来设置 NO_TRACING, DEFAULT_TRACING, SOCRATES_TRACING 和 FULL_TRACING 的跟踪属性
和使用默认配置相反,你可以添加下行代码到你的 .cfg 文件,打印的信息以 SoC 分析器可以使用的形式存在。
TraceUtil.attrs = TraceUtil.SOCRATES_TRACING;
配置 SOCRATES_TRACING 选项属性,可以开启 SoC 分析器进行跟踪和 DSP/BIOS 生成记录。GPP 端跟踪信息存储在文件 /tmp/cearmlog.txt, DSP 端跟踪信息被放置在 /tmp/cedsp0log.txt, DSP/BIOS 日志放在 /tmp/bioslog.dat。 投票( Polling )最初是被禁用。
有了这个选项,应用程序开始运行时的跟踪功能是被禁用,要打开跟踪,您或您的程序必须写一个命令来打开跟踪到 trace 命令管道。请参见4.8.6节,在运行时通过命名管道控制跟踪的详细信息。
另一种选择是,添加以下代码行到您的 .cfg 文件,使所有类型的跟踪成为可能:
TraceUtil.attrs = TraceUtil.FULL_TRACING;
SOCRATES_TRACING 的输出目的地是一样的,但 FULL_TRACING 同时使能 GPP 和 DSP 所有的等级的跟踪。
通过在 .cfg 文件中设置单独的 TraceUtil.attrs 成员,您可以进一步控制跟踪行为的详细信息。有关详细信息,请参阅在配置参考的 ti.sdo.ce.utils.trace.TraceUtil 模块的参考文档,这个文档在 CE_INSTALL_DIR/xdoc/index.html。
4.8.2 在应用程序的 C 代码中支持 TraceUtil
收集 DSP 产生的跟踪信息,你必须添加这些 C 代码行到您的 GPP 应用程序中:
#include <ti/sdo/ce/utils/trace/TraceUtil.h> ... /* call TraceUtil_start() after CERuntime_init() */ TraceUtil_start(engineName); /* engineName is a string */ ... TraceUtil_stop(); /* call at end of your app */
此代码产生一个线程,收集所有可用的 DSP 跟踪消息,并将其转储到一个文件或标准输出。(它还收集并存储 DSP/BIOS 日志信息,如果你想让它这样做)
4.8.3 配置 DSP 服务器的 DSP/BIOS 日志
如果您在 GPP 端设置 TraceUtil 使用 DSP/BIOS 日志记录,你还必须在你的 DSP Server 映像中启用 DSP/BIOS 日志记录。要做到这一点,添加下面一行到您的 DSP Server 的配置脚本中:
var LogServer = xdc.useModule('ti.sdo.ce.bioslog.LogServer');
如果你的 DSP 服务器不能开启 DSP/BIOS 日志记录,你会看到 GPP 端错误/警告消息如下所示:
LogClient_connect> Error: failed to locate server queue, Check if your DSP image has DSP/BIOS logging enabled LogClient_fwriteLogs> Warning: not connected to the DSP/BIOS log server on the DSP, cannot collect any DSP/BIOS log data.
4.8.4 配置 DSP 服务器重定向输出跟踪
当使用 Code Composer Studio( CCStudio )调试 DSP 服务器或单处理器的 DSP 应用程序,跟踪信息直接进入 CCStudio 的输出窗口。要做到这一点,修改 main() 例程,在调用 CERuntime_init() 之前,进行下面的调用:
GT_setprintf((GT_PrintFxn)printf);
这将导致每个跟踪调用映射到 DSP 标准 I/O 库的 printf() 函数中,这将把信息输出到 CCStudio 的控制台窗口。
需要注意的是 GT_setprintf() 函数的参数可以是带有参数 (char *format, …) 的任意函数。
4.8.5 在应用程序的启动时间配置 TraceUtil
在运行你的 TraceUtil 功能的应用程序,您可以设置以下环境变量的一个或多个覆盖在 .cfg 脚本中指定的 TraceUtil 属性:
1. CE_TRACE. GPP 端跟踪隐藏信息,参见4.8.7节,跟踪隐藏细节的掩码值。例如:
CE_TRACE="*=0567;OM-0"
2. CE_TRACEFILE. 指定 GPP 跟踪信息的输出文件,这可以是一个完整的路径(例如, /tmp/local.txt )或相对于可执行应用程序的路径。如果文件不能被打开(例如,如果指向一个不存在的目录),跟踪信息将输出到标准输出。例如:
CE_TRACE="trace/armtrace.txt";
3. CE_TRACEFILEFLAGS. 为所有要打开的文件设置文件创建标志。使用标准的 fopen() 函数的标志-"a" 意味着追加;“w” 表示重写。例如:
CE_TRACEFILEFLAGS="a"
4. TRACEUTIL_DSP0TRACEFILE. 指定 DSP 跟踪信息的输出文件。同 CE_TRACEFILE,这可以是一个完整的路径或或相对于可执行应用程序的路径。如果文件不能被打开,跟踪信息将输出到标准输出。
5. TRACEUTIL_DSP0BIOSFILE. 为 DSP/BIOS 日志指定输出的二进制文件。这可以是一个完整的路径或或相对于可执行应用程序的路径。如果文件不能被打开,不收集的日志信息。
6. TRACEUTIL_DSP0TRACEMASK. DSP端跟踪隐藏信息。参见4.8.7节,跟踪隐藏细节的掩码值。例如:
TRACEUTIL_DSP0TRACEMASK="*+01;ti.bios=01234567"
7. TRACEUTIL_REFRESHPERIOD. 在 GPP 端收集下一组 DSP 端跟踪信息之前,指定睡眠毫秒数值。您的选择应取决于产生的跟踪信息量和跟踪日志的大小而变化。如果不能设置该值足够低,可能会导致数据丢失。
8. TRACEUTIL_CMDPIPE. UNIX 命名管道的名称(例如,"fifo"),TraceUtil 模块应该监听该管道 run-time 跟踪命令。
9. TRACEUTIL_VERBOSE. 如果你想让 TraceUtil 打印出它正在使用的以及从哪儿得到的跟踪设置(掩码和文件),设置其值为1。
如果您在 Linux 上使用 bash shell,在启动你的应用程序的同一行设置环境变量,这是特别方便的,因此它们适用于仅应用程序的执行:
CE_TRACE="*+5" CE_TRACEFILE="mylog" TRACEUTIL_VERBOSE=1 ./app.out
在应用程序启动时间内,需要注意的是这些环境变量是只读的,在应用程序运行之后改变它们没有任何效果。
注:如果您启用 TraceUtil 模块,那么在以前版本中所描述的 CE_DSP0TRACE 环境变量将被忽略。
4.8.6 在运行时通过命名管道控制跟踪
如果 TRACEUTIL_CMDPIPE 环境变量被设置为一个有效的名称,或者如果 TraceUtil.attrs.cmdPipeFile 配置选项被设置,TraceUtil 线程将监听出现在管道中的任何跟踪命令。
SOCRATES_TRACING 使用命令管道功能。默认情况下,管道是 /tmp/cecmdpipe,但是名字可以通过设置 TRACEUTIL_CMDPIPE 环境变量来覆盖。
当您启动 SoC 分析器功能的应用程序,它最初提供除了(潜在的)警告和错误外,不提供其他的跟踪信息。重写这个初始行为的方法是:
1. 启动应用程序之前定义以下环境变量。参见4.8.7节,跟踪隐藏细节的掩码值。
CE_TRACE="*+5" TRACEUTIL_DSP0TRACEMASK="*+5,ti.bios=3"
2. 运行应用程序之前发出以下命令:
mkfifo /tmp/cecmdpipe; echo socrates=on > /tmp/cecmdpipe
mkfifo 命令仅对于第一次运行是必要的;如果它不存在,TraceUtil 创建管道,并在结束时不删除它。
当一个 SoC 分析器功能的应用程序正在运行,你可以通过写下面的字符串到 /tmp/cecmdpipe 文件来打开跟踪功能:
socrates=on
你可以通过写下面的字符串到 /tmp/cecmdpipe 文件来关闭跟踪功能:
socrates=off
socrates=on 和 socrates=off 管道命令是一组合适掩码的别名,这些别名在 TraceUtil.xdc 文件中定义。
写字符串到管道的最佳方法是使用一个 open-write-close 序列(而不是在整个会话中保持管道文件打开用于写入),[ create_pipe ] - > open_pipe- > write_text- > close_pipe 序列可以通过命令行、脚本(如在上面的例子中),或从C程序来完成。
下面的列表显示了支持跟踪管道的命令。
1. tracemask={GPP trace mask value}
设置 GPP 端跟踪掩码。例如,
tracemask=*+01234567,OM-1
2. dsp0tracemask={DSP0 trace mask value}
设置 DSP0 跟踪掩码。例如,
dsp0tracemask=*-1,ti.bios-012
3. refreshperiod={number of milliseconds}
设置 DSP0 跟踪和日志收集的刷新周期。如果为0,则不收集日志,直到指定一个非零 refreshperiod。例如,
refreshperiod=10
4 resetfiles (no arguments)
通过截断文件为0字节,重置那些目前正在使用的,GPP 跟踪,DSP0 跟踪和 DSP0 日志等所有打开的文件。
需要注意的是,每行应该只有一个命令写入到跟踪管道。然而,正如 socrates=on,您可以在应用程序的配置脚本中进行定义-给发出一些命令的管道定义别名,例如:
var TraceUtil = xdc.useModule('ti.sdo.ce.utils.trace.TraceUtil'); TraceUtil.attrs.cmdAliases = [ { alias: "mycommands_1", cmds: [ "resetfiles", "tracemask=*+5", "dsp0tracemask=*+5,ti.bios+3", "refreshperiod=200", ], }, { alias: "mycommands_2", cmds: [ "tracemask=*-5", "refreshperiod=0", "dsp0tracemask=*-5,ti.bios-3" ], }, /* and so on -- no limit on the number of aliases */ ];
4.8.7 跟踪掩码值
每个 VISA 模块可以提供实时的跟踪输出。运行时,以每个模块为基础,该输出可以启用和禁用。每个模块可以提供多达 8 个等级的跟踪信息。其中的几个等级具有普遍意义,例如,0 对应于“进入”( "entry" )跟踪(每个模块的入口点显示其名称和传递给它的参数)。
你可以在你的应用程序配置中使用这些常数:NO_TRACING,DEFAULT_TRACING,SOCRATES_TRACING 和 FULL_TRACING,这样就提供了简便的方法来设置通常所需的跟踪级别。如果你想定制各种模块的跟踪级别,你可以使用本节中的信息进行操作。
您可以设置跟踪掩码(在配置文件中,环境变量或命令管道)为一对名称/值( name/value )或对序列。其名称表明了应该设置哪个模块被跟踪,其值指示了允许该模块的跟踪等级。
例如,下面的设置使用 * (星号)作为通配符,开启 Codec Engine 全部跟踪。这导致了大量的输出,在确定内部发生什么,常常是有用的。
setenv CE_TRACE "*=01234567"
还可以设置模块的相同环境变量为不同的跟踪级别。要配置多个模块,你可以使用一个分号分开掩码。任何模块的星号名称/值( name/value )对之后的设置将覆盖通配符设置。
例如,下面设置所有模块为“1567”,除了 "OM"(你不希望看到的),"CV" (您想看到的所有信息):
setenv CE_TRACE "*=1567;OM=;CV=01234567"
下表列出了你可使用掩码的模块名称。它显示了哪些模块适用于 GPP 跟踪( CE_TRACE ),哪些适用于 DSP 跟踪( TRACEUTIL_DSP0TRACEMASK ):
* ti.bios, GT_prefix, 和 GT_time 是特殊的模块,在跟踪掩码中,它们不受模块通配符的影响,你必须把它们命名为直接改变状态后的形式,例如:
setenv CE_TRACE "*=67;GT_prefix=12" setenv TRACEUTIL_DSP0TRACEMASK "*=567;ti.bios=012"
对于标准模块的等级0到7,分别报告以下消息类型:
1. 7 = 致命错误
2. 6 = 警告
3. 5 = 标准( benchmarks )
4. 4 到 1 = 内部编解码器引擎的消息
5. 0 = 函数进入/退出报告
对于特殊模块( ti.bios, GT_prefix 和 GT_time )的等级具有如下特殊的含义:
对于GT_prefix ,所用的默认级别是 1,3 和 5。
对于GT_time ,DSP 时间戳总是周期的,不是微秒。只有在 GPP 上设置当前 GT_time 才有意义。
使用 Codec Engine 的 API 函数(八)