TI mmWave sensor毫米波雷達(dá)傳感器是高集成度的毫米波雷達(dá)傳感SOC,將中射頻電路,VCO,ADC,DSP 和硬件加速器集成在單顆芯片內(nèi),它具有集成度高,成本低,開發(fā)簡(jiǎn)單等優(yōu)點(diǎn),在汽車及工業(yè)中都有廣泛的應(yīng)用。本文介紹了使用CCS軟件的毫米波雷達(dá)傳感器在線調(diào)試的方法及步驟,同時(shí)提供了一種基于debug server scripting腳本的自動(dòng)加載實(shí)現(xiàn)方法,方便廣大開發(fā)者提高開發(fā)效率,本文的測(cè)試環(huán)境如下:
此方法適用器件型號(hào):I/AWR1443, I/AWR1642, I/AWR1843, I/AWR6843
本文測(cè)試軟件版本:mmWave SDK 3.5.0.4 out-of-box demo, Code Composer Studio Version: 10.2.0.00009
本文測(cè)試硬件平臺(tái):IWR6843ISK EVM
1. 使用Code Composer Studio (CCS) 集成開發(fā)環(huán)境(IDE) 對(duì)IWR6843進(jìn)行在線調(diào)試的步驟
對(duì)于CCS在線調(diào)試TI的毫米波雷達(dá)芯片而言,都需要遵循以下步驟。
步驟 | 說明 | 是否使用腳本 |
設(shè)置EVM為Flashing mode,使用Uniflash軟件燒寫ccs_debug.bin到板載flash | 一次操作 | |
設(shè)置EVM為functional mode | 一次操作 | |
生成Target Configuration File (CCXML) | 一次操作 | |
復(fù)位 | 每次ccs debug都需做 | |
使用JTAG 將CCS與硬件板卡連接 | 每次ccs debug都需做 | 可以使用腳本 |
使用Target Configuration File連接DSP/ARM核心 | 每次ccs debug都需做 | 可以使用腳本 |
分別加載DSP/ARM固件 | 每次ccs debug都需做 | 可以使用腳本 |
運(yùn)行&debug | 每次ccs debug都需做 | 可以使用腳本 |
斷點(diǎn)設(shè)置 | 每次ccs debug都需做 | 可以使用腳本 |
本文針對(duì)每次在線調(diào)試都需要手動(dòng)連接及加載BIN的部分,提供一種腳本用于自動(dòng)加載,節(jié)省用戶操作的時(shí)間,本文涉及的腳本覆蓋部分如上表描述。
2. 使用腳本對(duì)IWR6843進(jìn)行在線調(diào)試的步驟進(jìn)行自動(dòng)加載
2.1 工具介紹
Debug Server Scripting
調(diào)試服務(wù)器腳本 (Debug Server Scripting) 是調(diào)試服務(wù)器的一組跨平臺(tái) Java API,允許通過 Java 或 第三 方工具編寫腳本,例如 JavaScript(通過 Rhino)、Java、Python(通過 Jython)、TCL(通過 Jacl/Tclblend) 等, JavaScript 是 DSS 支持的默認(rèn)(和首選)腳本語言。調(diào)試服務(wù)器是 Code Composer Studio (CCS) 的基本調(diào)試引擎。 DSS 和 CCS IDE 都可以訪問它,可以理解為CCS的一個(gè)可執(zhí)行調(diào)試命令的組件,可參考文檔 。
Scripting Console
通過 CCS Scripting Console View可支持交互式腳本,Scripting Console中提供了使用示例。 可以從控制臺(tái)調(diào)用 Debug Server Scripting API。 可以從Scripting Console運(yùn)行完整的獨(dú)立 Debug Server Scripting JavaScript 文件。在CCS中,點(diǎn)擊View-> Scripting Console,即可打開此控制臺(tái)窗口。
2.2 JavaScript腳本實(shí)例
本文創(chuàng)建了一個(gè)可供在線調(diào)試使用的JavaScript腳本,示例如下,用戶使用此腳本可以完成CCS在線調(diào)試的自動(dòng)連接及固件加載。
腳本包含由幾個(gè)部分:
在您喜歡的文本編輯器中創(chuàng)建一個(gè)新文件,并將其保存在ccs 工程目錄子文件夾OOB_Handoff中,名為js。這是我們將為本實(shí)驗(yàn)創(chuàng)建腳本的文件。
使用importPackage()API導(dǎo)入腳本的相關(guān)包
// 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);
為我們將要使用的各種文件創(chuàng)建一些變量。您需要修改前幾個(gè)變量以匹配您的環(huán)境。要避免出現(xiàn)問題,請(qǐng)使用帶有正斜杠的完整路徑。
設(shè)置文件工作路徑及BIN文件路徑,修改部分在如下代碼示例中高亮。
一般把腳本放置于CCS工程,方便不同工程調(diào)試時(shí)直接修改。
//*******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";
設(shè)置CCS_TARGET_CONFIGURATION_FILE 路徑,修改部分在如下代碼示例中高亮。
創(chuàng)建并使用適用于用戶電腦CCS版本及XDS仿真器版本的target configuration file。
在CCS中,點(diǎn)擊File-> New -> Target configuration file 創(chuàng)建,創(chuàng)建完成后的ccxml文件,拷貝到JavaScript腳本所在路徑。
var CCS_TARGET_CONFIGURATION_FILE = "IWR6843.ccxml";
獲取ScriptingEnvironment對(duì)象的句柄
ScriptingEnvironment對(duì)象是進(jìn)入DSS會(huì)話的主要入口點(diǎn),也是創(chuàng)建其他可編寫腳本服務(wù)器和會(huì)話的步驟。
var script = ScriptingEnvironment.instance();
啟用和配置日志記錄
使用traceBegin()API啟用DSS日志記錄到logFile變量指定的文件。
DSS日志文件采用XML格式,使用XSLT(XML樣式表轉(zhuǎn)換)進(jìn)行樣式設(shè)置。我們使用CCS安裝路徑,腳本示例文件夾中提供的示例xsl文件。要查看樣式化的日志文件,建議使用Internet Explorer打開以獲得最佳兼容性。有關(guān)DSS日志記錄的更多詳細(xì)信息,請(qǐng)參見此處
script.traceBegin("BreakpointsTestLog.xml", "DefaultStylesheet.xsl")
使用traceSetConsoleLevel()和traceSetFileLevel()API設(shè)置控制臺(tái)和日志文件的詳細(xì)級(jí)別。
A. 以下形成可用追蹤級(jí)別的子集。順序?yàn)樽畹偷阶罡撸總€(gè)級(jí)別包含來自它上面的級(jí)別的所有消息):
TraceLevel.OFF (關(guān)閉記錄)
TraceLevel.SEVERE (只有來自調(diào)試器的非常嚴(yán)重的消息)
TraceLevel.WARNING (從調(diào)試器添加警告消息)
TraceLevel.INFO (添加基本消息和C I/O)
TraceLevel.ALL (記錄所有內(nèi)容)
B. 關(guān)于更多追蹤細(xì)節(jié),請(qǐng)參考文檔的TraceLevel
// Log everything
script.traceSetConsoleLevel(TraceLevel.ALL);
script.traceSetFileLevel(TraceLevel.ALL);
使用getServer()API建立與調(diào)試器的鏈接(DebugServer.1)
返回的DebugServer對(duì)象是調(diào)試器的主句柄。此對(duì)象用于配置調(diào)試器并啟動(dòng)目標(biāo)的調(diào)試會(huì)話。
script.setCurrentDirectory(PROJECT_DIR);
debugServer = script.getServer("DebugServer.1");
通過使用setConfig() API將目標(biāo)配置*.ccxml文件傳遞給調(diào)試服務(wù)器,為所需的目標(biāo)板配置調(diào)試器。
DebugSession對(duì)象將返回已啟動(dòng)的調(diào)試會(huì)話的主句柄。可以使用此對(duì)象訪問針對(duì)目標(biāo)的所有調(diào)試操作。
//CCXML file
debugServer.setConfig(CCS_TARGET_CONFIGURATION_FILE);
使用調(diào)試會(huì)話的目標(biāo)字段的connect()API連接到目標(biāo)。
Target類支持目標(biāo)執(zhí)行的方法(例如run,halt,restart),步進(jìn)和連接/斷開目標(biāo)。
分別連接并復(fù)位處理器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.");
將程序加載至內(nèi)存中。
Memory類支持內(nèi)存訪問的方法,如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.");
向目標(biāo)發(fā)出命令以運(yùn)行加載的程序。
Run()在目標(biāo)停止之前不會(huì)返回控制。直到目標(biāo)到達(dá)程序結(jié)束,將返回控制。
運(yùn)行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...");
使用調(diào)試服務(wù)器的stop()API關(guān)閉調(diào)試器。
此調(diào)用既關(guān)閉調(diào)試會(huì)話又關(guān)閉調(diào)試服務(wù)器(基本上終止調(diào)試器)
debugServer.stop();
結(jié)束日志文件追蹤并使用腳本環(huán)境的traceEnd() API禁用日志記錄。
建議您正確關(guān)閉日志文件。
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 斷點(diǎn)的設(shè)置方法
在使用JavaScript腳本的過程中,可以在腳本中設(shè)置斷點(diǎn),常用的斷點(diǎn)設(shè)置方法有以下三種。
使用地址設(shè)置斷點(diǎn):在0x100地址設(shè)置斷點(diǎn)
var bp1 = debugSession_MSS.breakpoint.add("0x100") // breakpoint with address
使用函數(shù)名設(shè)置斷點(diǎn):在MmwDemo_initTask函數(shù)調(diào)用處設(shè)置斷點(diǎn)
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"
使用行號(hào)設(shè)置斷點(diǎn):在c文件,4208行設(shè)置斷點(diǎn)
debugSession_MSS.breakpoint.add("mss_main.c", 4208);
3. 測(cè)試及輸出
3.1 前置工作
前置工作既是將ccs_debug.bin燒寫到板載QSPI FLASH,使硬件具備可在線調(diào)試的基本條件,基本操作步驟如下,亦可參考文檔:Using CCS Debug for Development
設(shè)置EVM為Flashing mode,使用Uniflash軟件燒寫bin到板載flash
設(shè)置EVM為functional mode,并復(fù)位一次
生成適用于當(dāng)前硬件芯片及仿真器的Target Configuration File (CCXML)
3.2 JavaScript腳本使用方法
將上文創(chuàng)建的ccsdebug_scripts_from_workspace.js腳本文件以及CCS TARGET CONFIGURATION FILE 放置于CCS工程路徑(如C:ccs_workspace_v10IWR6843_OOB_TESTOOB_Handoff),正確設(shè)置ccsdebug_scripts_from_workspace.js腳本文件中需要加載的xer4f文件名和路徑、xe674的文件名和路徑。
在CCS中,點(diǎn)擊View-> Scripting Console,打開Scripting Console窗口,在窗口中輸入loadJSFile "C:ccs_workspace_v10IWR6843_OOB_TESTOOB_Handoff ccsdebug_scripts_from_workspace.js" 并敲擊回車,運(yùn)行腳本。
腳本運(yùn)行過程中,會(huì)在Scripting Console窗口中輸出運(yùn)行狀態(tài)的打印信息,成功運(yùn)行的打印信息如下,即成功運(yùn)行腳本,并開始調(diào)試。
js:> loadJSFile "C:ccs_workspace_v10IWR6843_OOB_TESTOOB_Handoffccsdebug_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調(diào)試
通過腳本加載固件后,程序正確運(yùn)行,斷點(diǎn)陸續(xù)停在MmwDemo_initTask函數(shù)調(diào)用位置及mss_main.c文件->4208行位置。SDK3.5 out-of-box demo成功運(yùn)行后的打印信息如下:
[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. 總結(jié)
本文介紹了使用Debug Server Scripting以及JavaScript腳本對(duì)毫米波雷達(dá)SOC進(jìn)行調(diào)試的步驟及使用方法介紹,用戶可以較為方便的使用此腳本節(jié)省調(diào)試過程中的固件加載等步驟耗費(fèi)的時(shí)間,更高效的對(duì)毫米波雷達(dá)SOC進(jìn)行調(diào)試。本文覆蓋了使用Debug Server Scripting進(jìn)行在線調(diào)試的基本入門介紹,包含了如何創(chuàng)建和運(yùn)行簡(jiǎn)單的DSS腳本,以及如何在DSS腳本中設(shè)置斷點(diǎn)簡(jiǎn)化調(diào)試,用戶可參考Debug Server Scripting用戶指南獲得更多進(jìn)階功能的介紹。
審核編輯:郭婷
-
傳感器
+關(guān)注
關(guān)注
2553文章
51390瀏覽量
756566 -
dsp
+關(guān)注
關(guān)注
554文章
8059瀏覽量
350403 -
毫米波雷達(dá)
+關(guān)注
關(guān)注
107文章
1053瀏覽量
64539
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論