作者:Wesley He
TI mmWave sensor毫米波雷达传感器是高集成度的毫米波雷达传感SOC,将中射频电路,VCO,ADC,DSP 和硬件加速器集成在单颗芯片内,它具有集成度高,成本低,开发简单等优点,在汽车及工业中都有广泛的应用。本文介绍了使用CCS软件的毫米波雷达传感器在线调试的方法及步骤,同时提供了一种基于debug server scripting脚本的自动加载实现方法,方便广大开发者提高开发效率,本文的测试环境如下:
- 此方法适用器件型号:I/AWR1443, I/AWR1642, I/AWR1843, I/AWR6843
- 本文测试软件版本:mmWave SDK 3.5.0.4 out-of-box demo, Code Composer Studio Version: 10.2.0.00009
- 本文测试硬件平台:IWR6843ISK EVM
1. 使用Code Composer Studio (CCS) 集成开发环境(IDE) 对IWR6843进行在线调试的步骤
对于CCS在线调试TI的毫米波雷达芯片而言,都需要遵循以下步骤,具体的操作步骤,请参考文档:mmWave SDK out-of-box Developer's Guide 和Using CCS Debug for Development
步骤 |
说明 |
是否使用脚本 |
设置EVM为Flashing mode,使用Uniflash软件烧写ccs_debug.bin到板载flash |
一次操作 |
|
设置EVM为functional mode |
一次操作 |
|
生成Target Configuration File (CCXML) |
一次操作 |
|
复位 |
每次ccs debug都需做 |
|
使用JTAG 将CCS与硬件板卡连接 |
每次ccs debug都需做 |
可以使用脚本 |
使用Target Configuration File连接DSP/ARM核心 |
每次ccs debug都需做 |
可以使用脚本 |
分别加载DSP/ARM固件 |
每次ccs debug都需做 |
可以使用脚本 |
运行&debug |
每次ccs debug都需做 |
可以使用脚本 |
断点设置 |
每次ccs debug都需做 |
可以使用脚本 |
本文针对每次在线调试都需要手动连接及加载BIN的部分,提供一种脚本用于自动加载,节省用户操作的时间,本文涉及的脚本覆盖部分如上表描述。
2. 使用脚本对IWR6843进行在线调试的步骤进行自动加载
2.1 工具介绍
Debug Server Scripting
调试服务器脚本 (Debug Server Scripting) 是调试服务器的一组跨平台 Java API,允许通过 Java 或 第三 方工具编写脚本,例如 JavaScript(通过 Rhino)、Java、Python(通过 Jython)、TCL(通过 Jacl/Tclblend) 等, JavaScript 是 DSS 支持的默认(和首选)脚本语言。调试服务器是 Code Composer Studio (CCS) 的基本调试引擎。 DSS 和 CCS IDE 都可以访问它,可以理解为CCS的一个可执行调试命令的组件,可参考文档 。
Scripting Console
通过 CCS Scripting Console View可支持交互式脚本,Scripting Console中提供了使用示例。 可以从控制台调用 Debug Server Scripting API。 可以从Scripting Console运行完整的独立 Debug Server Scripting JavaScript 文件。在CCS中,点击View-> Scripting Console,即可打开此控制台窗口。
2.2 JavaScript脚本实例
本文创建了一个可供在线调试使用的JavaScript脚本,示例如下,用户使用此脚本可以完成CCS在线调试的自动连接及固件加载。
脚本包含由几个部分:
- 在您喜欢的文本编辑器中创建一个新文件,并将其保存在ccs 工程目录子文件夹OOB_Handoff中,名为js。这是我们将为本实验创建脚本的文件。
- 使用importPackage()API导入脚本的相关包
// Import the DSS packages into our namespace to save on typing
importPackage(Packages.com.ti.debug.engine.scripting);
importPackage(Packages.com.ti.ccstudio.scripting.environment);
importPackage(Packages.java.lang);
importPackage(Packages.java.io);
为我们将要使用的各种文件创建一些变量。您需要修改前几个变量以匹配您的环境。要避免出现问题,请使用带有正斜杠的完整路径。
- 设置文件工作路径及BIN文件路径,修改部分在如下代码示例中高亮。
- 一般把脚本放置于CCS工程,方便不同工程调试时直接修改。
//*******User must specify WORKSPACE_DIR***********
var WORKSPACE_DIR = "C:/ccs_workspace_v10/IWR6843_OOB_TEST/";
//*******User must specify WORKSPACE_DIR***********
var PROJECT_DIR = WORKSPACE_DIR+"OOB_Handoff/";
var R4F_OUT_FILE_PATH = WORKSPACE_DIR+"mmwave_sdk_68xx_dsp_mss/Debug/xwr68xx_mmw_demo_mss.xer4f";
var DSS_OUT_FILE_PATH = WORKSPACE_DIR+"mmwave_sdk_68xx_dsp_dss/Debug/xwr68xx_mmw_demo_dss.xe674";
- 设置CCS_TARGET_CONFIGURATION_FILE 路径,修改部分在如下代码示例中高亮。
- 创建并使用适用于用户电脑CCS版本及XDS仿真器版本的target configuration file。
- 在CCS中,点击File-> New -> Target configuration file 创建,创建完成后的ccxml文件,拷贝到JavaScript脚本所在路径。
var CCS_TARGET_CONFIGURATION_FILE = "IWR6843.ccxml";
- 获取ScriptingEnvironment对象的句柄
- ScriptingEnvironment对象是进入DSS会话的主要入口点,也是创建其他可编写脚本服务器和会话的步骤。
var script = ScriptingEnvironment.instance();
- 启用和配置日志记录
- 使用traceBegin()API启用DSS日志记录到logFile变量指定的文件。
- DSS日志文件采用XML格式,使用XSLT(XML样式表转换)进行样式设置。我们使用CCS安装路径,脚本示例文件夹中提供的示例xsl文件。要查看样式化的日志文件,建议使用Internet Explorer打开以获得最佳兼容性。有关DSS日志记录的更多详细信息,请参见此处
script.traceBegin("BreakpointsTestLog.xml", "DefaultStylesheet.xsl")
- 使用traceSetConsoleLevel()和traceSetFileLevel()API设置控制台和日志文件的详细级别。
A. 以下形成可用追踪级别的子集。顺序为最低到最高(每个级别包含来自它上面的级别的所有消息):
- TraceLevel.OFF (关闭记录)
- TraceLevel.SEVERE (只有来自调试器的非常严重的消息)
- TraceLevel.WARNING (从调试器添加警告消息)
- TraceLevel.INFO (添加基本消息和C I/O)
- TraceLevel.ALL (记录所有内容)
B. 关于更多追踪细节,请参考文档的TraceLevel
// Log everything
script.traceSetConsoleLevel(TraceLevel.ALL);
script.traceSetFileLevel(TraceLevel.ALL);
- 使用getServer()API建立与调试器的链接(DebugServer.1)
- 返回的DebugServer对象是调试器的主句柄。此对象用于配置调试器并启动目标的调试会话。
script.setCurrentDirectory(PROJECT_DIR);
debugServer = script.getServer("DebugServer.1");
- 通过使用setConfig() API将目标配置*.ccxml文件传递给调试服务器,为所需的目标板配置调试器。
- DebugSession对象将返回已启动的调试会话的主句柄。可以使用此对象访问针对目标的所有调试操作。
//CCXML file
debugServer.setConfig(CCS_TARGET_CONFIGURATION_FILE);
- 使用调试会话的目标字段的connect()API连接到目标。
- Target类支持目标执行的方法(例如run,halt,restart),步进和连接/断开目标。
- 分别连接并复位处理器DSS(DSP)、MSS(R4F)核心。
//Open R4F Debug Session
print("Debug session R4F...");
debugSession_MSS = debugServer.openSession("*","Cortex_R4_0");
print("Connecting to R4F Core...");
debugSession_MSS.target.connect();
debugSession_MSS.target.reset();
print("Done.");
//Open C674x Debug Session
print("Debug session C674x...");
debugSession_DSS = debugServer.openSession("*","C674X_0");
print("Connecting to C674x Core...");
debugSession_DSS.target.connect();
debugSession_DSS.target.reset();
print("Done.");
- 将程序加载至内存中。
- Memory类支持内存访问的方法,如save,load,read,write,register access和program loading。
- 分别加载固件到DSS(DSP)、MSS(R4F)核心。
//*******Load program***********
print("Loading program - C674x...");
debugSession_DSS.memory.loadProgram(DSS_OUT_FILE_PATH);
print("Done.");
print("Loading program - R4F...");
debugSession_MSS.memory.loadProgram(R4F_OUT_FILE_PATH);
print("Done.");
- 向目标发出命令以运行加载的程序。
- Run()在目标停止之前不会返回控制。直到目标到达程序结束,将返回控制。
- 运行DSS(DSP)、MSS(R4F)核心。
//*******Run***********
debugSession_DSS.target.runAsynch();
print("Running DSS core...");
sleep(1000);//sleep 1000ms
debugSession_MSS.target.runAsynch();
print("Running R4F core...");
- 使用调试服务器的stop()API关闭调试器。
- 此调用既关闭调试会话又关闭调试服务器(基本上终止调试器)
debugServer.stop();
- 结束日志文件追踪并使用脚本环境的traceEnd() API禁用日志记录。
- 建议您正确关闭日志文件。
scriptEnv.traceEnd();
脚本全文如下,用户可拷贝并保存为ccsdebug_scripts_from_workspace.js文件。
// Import the DSS packages into our namespace to save on typing
importPackage(Packages.com.ti.debug.engine.scripting);
importPackage(Packages.com.ti.ccstudio.scripting.environment);
importPackage(Packages.java.lang);
importPackage(Packages.java.io);
//*******User must specify WORKSPACE_DIR***********
var WORKSPACE_DIR = "C:/ccs_workspace_v10/IWR6843_OOB_TEST/";
//*******User must specify WORKSPACE_DIR***********
var PROJECT_DIR = WORKSPACE_DIR+"OOB_Handoff/";
var R4F_OUT_FILE_PATH = WORKSPACE_DIR+"mmwave_sdk_68xx_dsp_mss/Debug/xwr68xx_mmw_demo_mss.xer4f";
var DSS_OUT_FILE_PATH = WORKSPACE_DIR+"mmwave_sdk_68xx_dsp_dss/Debug/xwr68xx_mmw_demo_dss.xe674";
var CCS_TARGET_CONFIGURATION_FILE = "IWR6843.ccxml";
var script = ScriptingEnvironment.instance();
script.traceBegin("BreakpointsTestLog.xml", "DefaultStylesheet.xsl")
// Log everything
script.traceSetConsoleLevel(TraceLevel.ALL);
script.traceSetFileLevel(TraceLevel.ALL);
print("Starting Debug session...");
script.setCurrentDirectory(PROJECT_DIR);
debugServer = script.getServer("DebugServer.1");
//CCXML file
debugServer.setConfig(CCS_TARGET_CONFIGURATION_FILE);
//*******connect and reset the core***********
//Open R4F Debug Session
print("Debug session R4F...");
debugSession_MSS = debugServer.openSession("*","Cortex_R4_0");
print("Connecting to R4F Core...");
debugSession_MSS.target.connect();
debugSession_MSS.target.reset();
print("Done.");
//Open C674x Debug Session
print("Debug session C674x...");
debugSession_DSS = debugServer.openSession("*","C674X_0");
print("Connecting to C674x Core...");
debugSession_DSS.target.connect();
debugSession_DSS.target.reset();
print("Done.");
//*******Load program***********
print("Loading program - C674x...");
debugSession_DSS.memory.loadProgram(DSS_OUT_FILE_PATH);
print("Done.");
print("Loading program - R4F...");
debugSession_MSS.memory.loadProgram(R4F_OUT_FILE_PATH);
print("Done.");
/**
* Delay for a number of milliseconds
*/
function sleep(delay)
{
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
//*******Run***********
debugSession_DSS.target.runAsynch();
print("Running DSS core...");
sleep(1000);//sleep 1000ms
//*******Breakpoint test***********
//var bp1 = debugSession_MSS.breakpoint.add("0x100") // breakpoint with address
var breakpoint_address = debugSession_MSS.symbol.getAddress("MmwDemo_initTask") // Query for address of label "MmwDemo_initTask"
var bp1 = debugSession_MSS.breakpoint.add(breakpoint_address) // set breakpoint based on the address "MmwDemo_initTask"
debugSession_MSS.breakpoint.add("mss_main.c", 4208);
debugSession_MSS.target.runAsynch();
print("Running R4F core...");
2.3 断点的设置方法
在使用JavaScript脚本的过程中,可以在脚本中设置断点,常用的断点设置方法有以下三种。
- 使用地址设置断点:在0x100地址设置断点
var bp1 = debugSession_MSS.breakpoint.add("0x100") // breakpoint with address
- 使用函数名设置断点:在MmwDemo_initTask函数调用处设置断点
var breakpoint_address = debugSession_MSS.symbol.getAddress("MmwDemo_initTask") // Query for address of label "MmwDemo_initTask"
var bp1 = debugSession_MSS.breakpoint.add(breakpoint_address) // set breakpoint based on the address "MmwDemo_initTask"
- 使用行号设置断点:在c文件,4208行设置断点
debugSession_MSS.breakpoint.add("mss_main.c", 4208);
3. 测试及输出
3.1 前置工作
前置工作既是将ccs_debug.bin烧写到板载QSPI FLASH,使硬件具备可在线调试的基本条件,基本操作步骤如下,亦可参考文档:Using CCS Debug for Development
- 设置EVM为Flashing mode,使用Uniflash软件烧写bin到板载flash
- 设置EVM为functional mode,并复位一次
- 生成适用于当前硬件芯片及仿真器的Target Configuration File (CCXML)
3.2 JavaScript脚本使用方法
将上文创建的ccsdebug_scripts_from_workspace.js脚本文件以及CCS TARGET CONFIGURATION FILE 放置于CCS工程路径(如C:\ccs_workspace_v10\IWR6843_OOB_TEST\OOB_Handoff),正确设置ccsdebug_scripts_from_workspace.js脚本文件中需要加载的xer4f文件名和路径、xe674的文件名和路径。
在CCS中,点击View-> Scripting Console,打开Scripting Console窗口,在窗口中输入loadJSFile "C:\ccs_workspace_v10\IWR6843_OOB_TEST\OOB_Handoff\ ccsdebug_scripts_from_workspace.js" 并敲击回车,运行脚本。
脚本运行过程中,会在Scripting Console窗口中输出运行状态的打印信息,成功运行的打印信息如下,即成功运行脚本,并开始调试。
js:> loadJSFile "C:\ccs_workspace_v10\IWR6843_OOB_TEST\OOB_Handoff\ccsdebug_scripts_from_workspace.js"\
Starting Debug session...
Debug session R4F...
Connecting to R4F Core...
Done.
Debug session C674x...
Connecting to C674x Core...
Done.
Loading program - C674x...
Done.
Loading program - R4F...
Done.
Running DSS core...
Running R4F core...
3.3 CCS调试
通过脚本加载固件后,程序正确运行,断点陆续停在MmwDemo_initTask函数调用位置及mss_main.c文件->4208行位置。SDK3.5 out-of-box demo成功运行后的打印信息如下:
[Cortex_R4_0] Debug: Launched the Initialization Task
Debug: mmWave Control Initialization was successful
Debug: mmWave Control Synchronization was successful
[C674X_0] Debug: DPM Module Sync is done
[Cortex_R4_0] Debug: CLI is operational
Debug: Sending rlRfSetLdoBypassConfig with 0 0 0
============ Heap Memory Stats ============
Size Used Free DPCUsed
System Heap(TCMB) 32768 27896 4872 2048
L3 786432 131072 655360
localRam(TCMB) 4096 512 3584
============ Heap Memory Stats ============
Size Used Free DPCUsed
System Heap(L2) 32768 16112 16656 0
L3 786432 8192 778240
localRam(L2) 50176 15016 35160
localRam(L1) 16384 5632 10752
Starting Sensor (issuing MMWave_start)
4. 总结
本文介绍了使用Debug Server Scripting以及JavaScript脚本对毫米波雷达SOC进行调试的步骤及使用方法介绍,用户可以较为方便的使用此脚本节省调试过程中的固件加载等步骤耗费的时间,更高效的对毫米波雷达SOC进行调试。本文覆盖了使用Debug Server Scripting进行在线调试的基本入门介绍,包含了如何创建和运行简单的DSS脚本,以及如何在DSS脚本中设置断点简化调试,用户可参考Debug Server Scripting用户指南获得更多进阶功能的介绍。
5. 参考资料
- IWR6843、IWR6443 单芯片 60GHz 至 64GHz 毫米波传感器 数据表 (Rev. D)
- mmWave SDK out-of-box Developer's Guide https://dev.ti.com/tirex/content/mmwave_industrial_toolbox_4_10_1/labs/Out_Of_Box_Demo/docs/Out_Of_Box_Demo_User_Guide.html
- Using CCS Debug for Development https://dev.ti.com/tirex/content/mmwave_industrial_toolbox_4_10_1/docs/software_guides/using_ccs_debug.html
- mmWave SDK User’s Guide: C:\ti\mmwave_sdk_03_05_00_04\docs\mmwave_sdk_user_guide.pdf
- Code Composer Studio user’s guide
https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html#
- DSS Fundamentals Workshop
https://software-dl.ti.com/ccs/esd/training/workshop/ccsv9/dss_fundamentals-workshop-chinese.html