<!-- Start of markdown source --> <!-- Stylistic notes: - Use the 'text' syntax highlighting for blocks of code from the command prompt - For Informational notes try to use blue alerts or callouts ({{b }} or [[b ]]) - For warnings or error troubleshooting try to use yellow alerts or callouts ({{y }} or [[ y]]) --> 教学大纲 --------------- **DSS**是调试服务器(调试器)中的一组Java API,它允许通过第三方工具编写脚本。这篇教学通过JavaScript(DSS的默认脚本语言)提供了对DSS的基本实用介绍。详细资料可以参考[用户手册](https://software-dl.ti.com/ccs/esd/documents/users_guide_zh/sdto_dss_handbook.html)。 ### API文档 Debug Server API文档包含在**Code Composer Studio**桌面版的安装中。要查看此文档,请打开以下文件,然后单击** DS API Documentation **链接(<tt>CCS_INSTALL_DIR</tt> 是您计算机上CCS的位置,例如,对于Windows上的**CCS**,它可能是<tt>C:/ti/ccsv8 /</tt>)。 <tt>&lt;CCS_INSTALL_DIR&gt;/ccs_base/scripting/docs/GettingStarted.html</tt> ![An image showing the DSS API documentation for the 'Expression' class.](./images/dss_workshop_docs.PNG) 在屏幕的左上角是软件包。下面是类列表。右侧是主窗口,显示类的描述以及方法列表。您可以在做教学实验时查阅相关文档。 准备阶段 --------------- * [Code Composer Studio (CCS)](https://processors.wiki.ti.com/index.php/Download_CCS) (版本8.3及以上) * SimpleLink CC1352R1 LaunchPad和一个USB连接器 * [<tt>DSS-Workshop</tt>](./files/DSS-Workshop.zip) 文件夹 <!-- TODO: make a link! --> 记下CCS安装位置和您存储<tt>DSS-Workshop</tt> 的位置。默认分别存储在<tt>C:/ti/</tt> 和 <tt>C:/CCS-Workshops/</tt>。 ### 设置 以下步骤是所有实验共同的基本设置。相同的命令提示符窗口可用于多个实验,无需重复进行此设置。 1. 为了便于实验,请确保使用的LaunchPad是唯一连接到计算机的板子。 2. 打开命令提示符或终端窗口,将目录更改为**<tt>DSS-Workshop</tt>**文件夹。默认位置是**<tt>C:/CCS-Workshops/</tt>**。 3. 运行<tt>setpath.bat</tt>文件并提供CCS安装的路径作为参数(例如**<tt>C:/ti/ccsv8</tt>**)。在路径周围使用引号避免空格问题。 范例: ```text > setpath "C:/ti/ccsv9/" ``` [[+y OS X和Linux用户 (展开) 不使用<tt>setpath.bat</tt>,输入以下命令: ```text PATH="$PATH:<CCS_INSTALL_PATH>/ccsv<RELEASE_#>/ccs_base/scripting/bin" ``` 这样会保证<tt>dss.sh</tt>在您的路径当中。 +]] 您可以开始实验了! ### JavaScript基础入门 为确保读者熟悉基本的[JavaScript语法](https://www.w3schools.com/js/js_syntax.asp),我们提供了此概述。以下语法对于本片教学来说足够了。 ```javascript // Comments are like C and Java /* This is also a JavaScript comment */ // Semi-colons are used to end statements (like C and Java) x = 1; // Variables are dynamically typed and are declared with a `var` statement var x; var y = "y"; // Strings are concatenated using the `+` operator print("He" + "llo"); // prints Hello in the console // Control statements are similar to C and Java // if, else, switch, for, while, etc. if (condition) { doSomething(); } // Functions can be defined with the `function` keyword function foo(x) { y = x; } // Call methods via <object>.<method> myObject.objectMethod(myArgument); ``` Lab 1 &mdash; 创建和运行基本DSS脚本 -------------- 在本实验中,您将创建一个基本的DSS JavaScript脚本,该脚本将在**SimpleLink CC1352R1 LaunchPad**上加载并运行示例程序(**<tt>blinky20.out</tt>**)。然后,您将从命令行运行脚本并观察结果。实验室将简要介绍所使用的对象和方法,完整描述可在文档[documentation](#api-documentation)中找到。 ### 创建脚本 1. 在您喜欢的文本编辑器中创建一个新文件,并将其保存在**<tt>DSS-Workshop/lab1</tt>**目录中,名为**<tt>lab1.js</tt>**。这是我们将为本实验创建脚本的文件。 {{b CCS编辑器支持JavaScript文件的语法显示。}} 2. 使用`importPackage()`API导入脚本的相关包。 ```javascript importPackage(Packages.com.ti.debug.engine.scripting); importPackage(Packages.com.ti.ccstudio.scripting.environment); importPackage(Packages.java.lang); ``` 3. 为我们将要使用的各种文件创建一些变量。您需要修改前几个变量以匹配您的环境。要避免出现问题,请使用带有正斜杠的完整路径。 ```javascript // Modify the following two variables to match your environment. Use forward slashes and full paths. // (non-windows users: instead of ~/ use the full path to your home folder) // The first variable should match the argument passed to setpath.bat // The second should be the path for the DSS-Workshop folder var ccsInstallDir = "C:/ti/ccsv8/"; var dssWorkshopDir = "C:/CCS-Workshops/DSS-Workshop/"; // The necessary files var logFile = dssWorkshopDir + "/lab1/log.xml"; var logFileStylesheet = ccsInstallDir + "/ccs_base/scripting/examples/DebugServerExamples/DefaultStylesheet.xsl"; var deviceCCXMLFile = dssWorkshopDir + "/target-config/CC1352R1F3.ccxml"; var programToLoad = dssWorkshopDir + "/lab1/blinky20.out"; ``` 4. 获取`ScriptingEnvironment`对象的句柄 ```javascript var scriptEnv = ScriptingEnvironment.instance(); ``` {{b `ScriptingEnvironment`对象是进入DSS会话的主要入口点,也是创建其他可编写脚本服务器和会话的工厂。}} 5. 启用和配置日志记录 使用`traceBegin()`API启用DSS日志记录到`logFile`变量指定的文件。 ```javascript scriptEnv.traceBegin(logFile, logFileStylesheet); ``` {{b DSS日志文件采用**XML**格式,使用**XSLT**(XML样式表转换)进行样式设置。我们使用CCS安装中脚本示例文件夹中提供的示例**<tt>DefaultStylesheet.xsl</tt>**文件。要查看样式化的日志文件,建议使用**Internet Explorer**获得最佳兼容性。有关DSS日志记录的更多详细信息,请参见[此处](https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html#logging).}} 6. 使用`traceSetConsoleLevel()`和`traceSetFileLevel()`API设置控制台和日志文件的详细级别。 ```javascript scriptEnv.traceSetConsoleLevel(TraceLevel.INFO); scriptEnv.traceSetFileLevel(TraceLevel.ALL); ``` {{b 以下形成可用追踪级别的子集。顺序为最低到最高(每个级别包含来自它上面的级别的所有消息): - `TraceLevel.OFF` (关闭记录) - `TraceLevel.SEVERE` (只有来自调试器的非常严重的消息) - `TraceLevel.WARNING` (从调试器添加警告消息) - `TraceLevel.INFO` (添加基本​​消息和C I/O) - `TraceLevel.ALL` (记录所有内容) 关于更多追踪细节,请参考[文档](#api-documentation)的`TraceLevel`}} 7. 使用`getServer()`API建立与调试器的链接(**DebugServer.1**) ```javascript var debugServer = scriptEnv.getServer("DebugServer.1"); ``` {{b 返回的`DebugServer`对象是调试器的主句柄。此对象用于配置调试器并启动目标的调试会话。}} 8. 通过使用`setConfig()`API将目标配置**\*.ccxml**文件传递给调试服务器,为所需的目标板配置调试器。 ```javascript debugServer.setConfig(deviceCCXMLFile); ``` 9. 使用`openSession()`API在LaunchPad上打开**Cortex M4**处理器的调试会话。 ```javascript var debugSession = debugServer.openSession("*", "Cortex_M4_0"); ``` {{b `DebugSession`对象将返回已启动的调试会话的主句柄。可以使用此对象访问针对目标的所有调试操作。}} [[b 多个配置的目标 某些板卡(如**CC1352R1 LaunchPad**)具有多个可调试对象(CPU)。通过提供参数“*”,“Cortex_M4_0”,将在第一个配置的连接(板)上向Cortex M4 CPU打开调试会话。为避免潜在问题,我们要求您在完成这些实验时确保只有一块电路板连接到您的机器。 要了解有关为调试会话指定目标的更多信息,浏览[文档](#api-documentation)中`DebugServer.openSession()`。]] 10. 使用调试会话的目标字段的**<tt>connect()</tt>**API连接到目标。 ```javascript debugSession.target.connect(); ``` {{b **Target**类支持目标执行的方法**(例如`run`,`halt`,`restart`)**,步进和连接/断开目标。}} 11. 将程序(**<tt>blinky20.out</tt>**)加载至内存中。 ```javascript debugSession.memory.loadProgram(programToLoad); ``` {{b `Memory`类支持内存访问的方法,如`save`,`load`,`read`,`write`,`register access`和`program loading`。}} 12. 向目标发出命令以运行加载的程序。 ```javascript debugSession.target.run(); ``` {{b `run()`在目标停止之前不会返回控制。直到目标到达程序结束,将返回控制。}} 13. 使用调试服务器的`stop()`API关闭调试器。 ```javascript debugServer.stop(); ``` {{b 此调用既关闭调试会话又关闭调试服务器(基本上终止调试器)}} 14.结束日志文件追踪并使用脚本环境的`traceEnd()`API禁用日志记录。 ```javascript scriptEnv.traceEnd(); ``` {{b 建议您正确关闭日志文件。}} 15. 确保在**<tt>lab1</tt>**子文件夹中将文件存为**<tt>lab1.js</tt>**。 [[+d 最终的脚本(展开) [[r 注意: 添加了一些可选的`traceWrite`调用以在控制台中提供一些反馈。]] ```javascript // Import the DSS Packages into our namespace to save ourselves some typing importPackage(Packages.com.ti.debug.engine.scripting); importPackage(Packages.com.ti.ccstudio.scripting.environment); importPackage(Packages.java.lang); // Modify the following two variables to match your environment. Use forward slashes and full paths. // (non-windows users: instead of ~/ use the full path to your home folder) // The first variable should match the argument passed to setpath.bat // The second should be the path for the DSS-Workshop folder var ccsInstallDir = "C:/ti/ccsv8/"; var dssWorkshopDir = "C:/CCS-Workshops/DSS-Workshop/"; // The necessary files var logFile = dssWorkshopDir + "/lab1/log.xml"; var logFileStylesheet = ccsInstallDir + "/ccs_base/scripting/examples/DebugServerExamples/DefaultStylesheet.xsl"; var deviceCCXMLFile = dssWorkshopDir + "/target-config/CC1352R1F3.ccxml"; var programToLoad = dssWorkshopDir + "/lab1/blinky20.out"; // Get a handle to the scripting environment object var scriptEnv = ScriptingEnvironment.instance(); // Create a log file to log script execution scriptEnv.traceBegin(logFile, logFileStylesheet); // Set the trace verbosity levels for the console and the logs scriptEnv.traceSetConsoleLevel(TraceLevel.INFO); scriptEnv.traceSetFileLevel(TraceLevel.ALL); // Optional scriptEnv.traceWrite("Begin scripting session"); // Get a handle to a ScriptServer object to interact with the debugger var debugServer = scriptEnv.getServer("DebugServer.1"); // Set the target configuration debugServer.setConfig(deviceCCXMLFile); // Open a debug session with the first configured target var debugSession = debugServer.openSession("*", "Cortex_M4_0"); // Connect to the target debugSession.target.connect(); // Load our program debugSession.memory.loadProgram(programToLoad); // Run the target debugSession.target.run(); // Target has finished running, terminate the debugger debugServer.stop(); // Optional scriptEnv.traceWrite("End scripting session"); // Stop logging and exit scriptEnv.traceEnd(); ``` +]] ### 运行脚本 1. 如果尚未设置,请打开命令提示符或终端窗口,然后按照**设置**中的说明设置环境。 2. 将工作文件夹更改至<tt>DSS-Workshop/lab1/</tt>。 3. 运行脚本 ```text > dss lab1.js ``` [[+y OS X或Linux显示"dss: command not found"? (展开) dss脚本可能没有执行权限。请尝试以下方法: ```text > dss.sh lab1.js ``` 如果问题还没解决,打开CCS installation中的`ccs_base/scripting/bin/`子文件夹(打开**#设置**). +]] 脚本将运行,LaunchPad上的LED将闪烁20次,然后终止。如果您在上面的最终脚本中添加了可选的`traceWrite`调用,那么您的控制台将出现: ```text C:\CCS-Workshops\DSS-Workshop\lab1>dss lab1.js Begin scripting session Cortex_M4_0: GEL Output: Board Reset Complete. End scripting session ``` [[b 注意 使用`scriptEnv.traceWrite()`添加了**“Begin scripting session”**和**“End scripting session”**两行,以便在脚本运行时更加清晰。请参阅上面给出的最终脚本以获取详细信息。 ]] 4. 在Web浏览器中打开生成的日志文件**<tt>lab1/log.xml</tt>**(建议使用Internet Explorer以实现兼容性)。如果正确使用了默认的**XML**样式表,它应该如下图所示: ![An example of a log file styled using DefaultStylesheet.xsl](./images/dss_workshop_log_file.PNG) 请注意,日志文件包含的信息远多于输出到控制台的信息,包括序列号,计时信息和状态消息(因为选择了更详细的跟踪级别)。 Lab 2 &mdash; 使用Rhino调试器 -------------- 在本实验中,您将使用[Rhino Debugger](https://www.mozilla.org/rhino/debugger.html)调试和修复损坏的DSS脚本。 ### 运行范例脚本 1. 在编辑器中打开**<tt>lab2</tt>**子文件夹中的范例脚本**<tt>lab2a.js</tt>**,修改前两个变量以匹配您的安装。保存文件。 2. 如果尚未设置,请打开命令提示符或终端窗口,然后按照[设置部分](#设置)中的说明设置环境。 3. 将目录更改为**<tt>lab2</tt>**子文件夹并运行提供的示例脚本。 ```text > dss lab2a.js ``` 该脚本将启动LaunchPad的调试会话,并尝试加载并运行提供的**“Hello World”**示例程序,但会失败并出现错误。 ```text C:\CCS-Workshops\DSS-Workshop\lab2>dss lab2a.js Begin scripting session SEVERE: Cannot perform operation, target is not connected. SEVERE: Error loading "C:/CCS-Workshops/DSS-Workshop//lab2/hello.out": Cannot perform operation, target is not connected. org.mozilla.javascript.WrappedException: Wrapped com.ti.ccstudio.scripting.environment.ScriptingException: Error loading "C:/CCS-Workshops/DSS-Workshop//lab2/hello.out": Cannot perform operation, target is not connected. (lab2a.js#50) at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1693) at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:160) at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:204) at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:66) at org.mozilla.javascript.gen.c1._c0(lab2a.js:50) at org.mozilla.javascript.gen.c1.call(lab2a.js) at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:340) at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2758) at org.mozilla.javascript.gen.c1.call(lab2a.js) at org.mozilla.javascript.gen.c1.exec(lab2a.js) at org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:503) at org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:425) at org.mozilla.javascript.tools.shell.Main.processFile(Main.java:391) at org.mozilla.javascript.tools.shell.Main.processSource(Main.java:382) at org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:179) at org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:100) at org.mozilla.javascript.Context.call(Context.java:528) at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:450) at org.mozilla.javascript.tools.shell.Main.exec(Main.java:162) at com.ti.ccstudio.apps.internal.scripting.RunScript$1.run(RunScript.java:89) Caused by: com.ti.ccstudio.scripting.environment.ScriptingException: Error loading "C:/CCS-Workshops/DSS-Workshop//lab2/hello.out": Cannot perform operation, target is not connected. at com.ti.debug.engine.scripting.Memory.loadProgram(Memory.java:932) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:145) ... 18 more ``` 错误消息表明程序加载失败,因为我们没有连接到目标。可以在日志文件**<tt>lab2/log.xml</tt>**的末尾找到相同的错误消息。 ![Log entry that reads 'Error loading "hello.out": Cannot perform operation, target is not connected.'](./images/dss_workshop_connect_error_log.PNG) 这很奇怪,因为在**<tt>lab2a.js</tt>**的第46行我们调用了`target.connect()`。 {{r 您可能已经在脚本中发现了该错误,但尚未修复它。我们的目的是展示使用Rhino调试器来调试脚本。}} ### Rhino调试器 1. 添加`-dss.debug`选项给dss脚本,在Rhino调试器中运行示例脚本。 ```text > dss -dss.debug lab2.js ``` 该脚本将由调试器执行,并在脚本开始时暂停。 ![运行上述命令后立即出现的**Rhino Debugger**窗口。](./images/dss_workshop_rhino.PNG) 2. 使用**Step Over**按钮逐步执行脚本,看看是否曾调用`target.connect()`。 请注意,由于在它之前的if语句中存在错误,因此永远不会达到`target.connect()`。 ```javascript // Check to see if the target is already connected // target.isConnected() API will return 'true' if it is connected if (debugSession.target.isConnected()) { // Connect to the target debugSession.target.connect(); } ``` 如果目标已连接,`target.isConnected()`API将返回**true**,否则返回**false**。目的是检查目标是否已连接,如果不是这样,进行连接。因此,if语句中的条件应该被否定。 ```javascript if (!debugSession.target.isConnected()) ``` 3. 关闭Rhino Debugger窗口。使用文本编辑器修改有问题的if语句,以便在目标尚未连接时调用`target.connect()`。将生成的文件保存在**<tt>lab2</tt>**子文件夹中的**<tt>lab2b.js</tt>**。 4. 从命令提示符或终端运行修改后的脚本。该脚本应该成功运行,您应该看到以下输出: ```text C:\CCS-Workshops\DSS-Workshop\lab2>dss lab2b.js Begin scripting session Cortex_M4_0: GEL Output: Board Reset Complete. Hello World! End scripting session ``` [这里](https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html#debugging-your-javascript)可以找到有关Rhino调试器的更多详细信息。 Lab 3 &mdash; 捕捉异常 -------------- 在本节实验中,您将修改示例脚本以捕获和处理DSS API异常。 1. 在**<tt>lab3</tt>**文件夹中打开提供的示例脚本**<tt>lab3a.js</tt>**文件,然后修改前两个变量以匹配您的安装。保存文件。 2. 如果尚未设置,请打开命令提示符或终端窗口,然后按照**设置**中的说明设置环境。 3. 将目录更改为**<tt>lab3</tt>**子文件夹并运行提供的示例脚本。 ```text > dss lab3a.js ``` 该脚本将启动LaunchPad的调试会话,并尝试加载并运行示例程序(**<tt>modem.out</tt>**),但会失败并出现错误。 ```text C:\CCS-Workshops\DSS-Workshop\lab3>dss lab3a.js Begin scripting session Cortex_M4_0: GEL Output: Board Reset Complete. SEVERE: Cortex_M4_0: GEL: File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. SEVERE: File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. SEVERE: Error loading "C:/CCS-Workshops/DSS-Workshop//lab3/modem.out": File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. org.mozilla.javascript.WrappedException: Wrapped com.ti.ccstudio.scripting.environment.ScriptingException: Error loading "C:/CCS-Workshops/DSS-Workshop//lab3/modem.out": File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. (lab3a.js#45) at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1693) at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:160) at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:204) at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:66) at org.mozilla.javascript.gen.c1._c0(lab3a.js:45) at org.mozilla.javascript.gen.c1.call(lab3a.js) at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:340) at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2758) at org.mozilla.javascript.gen.c1.call(lab3a.js) at org.mozilla.javascript.gen.c1.exec(lab3a.js) at org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:503) at org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:425) at org.mozilla.javascript.tools.shell.Main.processFile(Main.java:391) at org.mozilla.javascript.tools.shell.Main.processSource(Main.java:382) at org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:179) at org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:100) at org.mozilla.javascript.Context.call(Context.java:528) at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:450) at org.mozilla.javascript.tools.shell.Main.exec(Main.java:162) at com.ti.ccstudio.apps.internal.scripting.RunScript$1.run(RunScript.java:89) Caused by: com.ti.ccstudio.scripting.environment.ScriptingException: Error loading "C:/CCS-Workshops/DSS-Workshop//lab3/modem.out": File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. at com.ti.debug.engine.scripting.Memory.loadProgram(Memory.java:932) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:145) ... 18 more ``` 错误消息表明**<tt>modem.out</tt>**程序不是为我们的LaunchPad上的**Cortex M4**处理器构建的。 {{b Debug Server API抛出Java异常。您可以处理脚本中的异常以正常失败或继续(相关资料:[JavaScript's Try-Catch-Throw-Finally](https://www.w3schools.com/js/js_errors.asp)).}} 4. 修改脚本以捕获`memory.loadProgram()`抛出的异常并正常终止脚本。 ```javascript try { debugSession.memory.loadProgram(programToLoad); } catch (ex) { scriptEnv.traceWrite("Program load of " + programToLoad + " failed!\nTerminating script."); quit(); } ``` {{b JavaScript`quit()`调用将正常终止JavaScript会话。}} 5. 将修改后的脚本保存为**<tt>lab3</tt>**子文件夹中的**<tt>lab3b.js</tt>**。 6. 运行命令提示符或终端运行修改后的脚本。该脚本应该成功运行,您的控制台应如下所示: ```text C:\CCS-Workshops\DSS-Workshop\lab3>dss lab3b.js Begin scripting session Cortex_M4_0: GEL Output: Board Reset Complete. SEVERE: Cortex_M4_0: GEL: File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. SEVERE: File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. SEVERE: Error loading "C:/CCS-Workshops/DSS-Workshop//lab3/modem.out": File: C:/CCS-Workshops/DSS-Workshop//lab3/modem.out Does not match the target type, not loaded. Program load of C:/CCS-Workshops/DSS-Workshop//lab3/modem.out failed! Terminating script. ``` Lab 4 &mdash; 脚本控制台和断点 --------------- 在本实验中,您将了解CCS中的**Scripting Console**,并了解如何从**Scripting Console**运行DSS脚本。您还将学习如何在DSS脚本中设置**断点**。 {{b Code Composer Studio的脚本控制台提供交互式脚本支持。可以从控制台调用Debug Server API,并且可以运行完整的DSS脚本。更多详情可在[这里找到](https://software-dl.ti.com/ccs/esd/documents/ccsv7_scripting_console.html)。}} ### 脚本控制台 1. 打开Code Composer Studio并选择以下位置作为工作区文件夹: ```text <DSS_WORKSHOP_INSTALL_DIR>/DSS-Workshop/lab4/workspace/ ``` 你可以关闭*Getting Started*页面。 2. 从菜单栏中选择**View -> Scripting Console**,打开Scripting Console。默认情况下,脚本控制台将在页面底部的某处打开。 ![A window titled "Scripting Console" in Code Composer Studio](./images/dss_workshop_scripting_console.PNG) 3. 按TAB键以获取支持的命令列表。(同意**display all possibilities**) 4. 使用`help`获取命令的帮助条目。例如,键入“help loadJSFile”会显示以下内容: ```text js:> help loadJSFile Description: Load a JavaScript file or all the JavaScript files in the directory. Example: loadJSFile c:\myDirectory\myJavaScript.js Syntax: loadJSFile(file,store) Arguments: file - the JavaScript file or a directory. store - [optional] true, store the file(s) to the preference, the script will auto reload the next time the view is open. ``` ###从脚本控制台运行脚本 从**Scripting Console**运行在实验1中创建的DSS脚本(完整脚本可以在[建立脚本](#创建脚本)的末尾找到)。将**<tt>C:/CCSWorkshops/</tt>**替换为计算机上**<tt>DSS-Workshop</tt>**文件夹的路径。 ```text js:> loadJSFile(C:/CCS-Workshops/DSS-Workshop/lab1/lab1.js) ``` [[y 检查你的路径 如果遇到错误,请确保脚本控制台和**<tt>lab1.js</tt>**脚本中使用的所有路径都是正确的,使用正斜杠的完整路径。]] 脚本将被执行并且可以观察到以下内容: 1. 启动调试会话时,CCS将切换到**CCS Debug**模式。 脚本操作将在GUI中可见,但操作可能执行得太快而无法看到。 2. 程序运行时,LaunchPad上的LED将闪烁20次。 3. 当脚本终止调试会话时,CCS将切换到**CCS Edit**模式。 ### 设置断点 1. 从**Scripting Console**运行实验2(**<tt>lab2b.js</tt>**)中的(固定)脚本,如上**从脚本控制台运行脚本**。 ```text js:> loadJSFile(C:/CCS-Workshops/DSS-Workshop/lab2/lab2b.js) ``` 一切都应该像在实验1中运行脚本时那样进行,LED不会闪烁,文本“Hello World!”将被打印到C I/O控制台(这可能发生得太快,无法看到)。 2. 切换回**CCS Debug**模式(** Window -> Open Perspective -> CCS Debug **)并确认“Hello World!”被正确输出到C I/O控制台。 ![In the CCS Console window the text "Hello World!" appears.](./images/dss_workshop_hello_console.PNG) 3. 在文本编辑器中打开位于**<tt>lab2</tt>**子文件夹中的**<tt>hello.c</tt>**源文件。记下该行的行号。 ```C printf("Hello World!\n"); ``` (The line number should be 7.) 4. 从实验2中打开脚本**<tt>lab2b.js</tt>**并使用`breakpoint.add()`API在程序加载后设置断点。 ```javascript ... // Load a program debugSession.memory.loadProgram(programToLoad); // Add a breakpoint at the printf() statement debugSession.breakpoint.add("hello.c", 7); // Run the target debugSession.target.run(); // All done debugServer.stop(); ... ``` {{b 要了解有关在DSS中使用断点的详细信息,请参阅[此链接](https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html#breakpoints)或**API文档**。}} 5. 删除`DebugServer.stop()`调用以停止/终止调试器。在到达断点后,调试会话应保持打开状态。 ```javascript ... // Run the target debugSession.target.run(); // All done // debugServer.stop(); Removed ... ``` {{b `target.run()`在目标停止时返回控制。这将首先在到达断点时发生(在前面的示例中,这仅在到达程序结束时发生)。因此,这个新脚本不应该在重新获得控制时结束调试会话。}} 6. 将生成的脚本保存为**<tt>lab4</tt>**子文件夹中的**<tt>lab4.js</tt>**。 7. 从脚本控制台运行**<tt>lab4.js</tt>**脚本。 ```text js:> loadJSFile(C:/CCS-Workshops/DSS-Workshop/lab4/lab4.js) ``` CCS将切换到**CCS Debug**模式,目标将在我们设置的断点位置停止,脚本将退出而不终止调试会话。 [[y CCS无法找到来源? CCS可能无法找到源文件**<tt>hello.c</tt>**,因为可执行文件是使用不同目录中的源文件构建的。使用**Locate File... **按钮将CCS定向到包含**<tt>hello.c</tt>**的文件夹(可以在**<tt>lab2</tt>**子目录中找到)。]] 8. CCS显示源文件,并在我们在`printf()`语句中设置的断点处停止执行。 9. 单步执行(F6)`printf()`语句继续调试应用程序。请注意文本“Hello World!”出现在C I/O控制台窗口中。 10. 您现在可以在CCS中终止调试器(**Ctrl+F2**)。 总结 --------------- 您现在应该熟悉**Debug Server Scripting**的基础知识。第一个实验涵盖了如何创建和运行简单的DSS脚本。第二个实验演示了如何使用**Rhino Debugger**调试脚本。以下实验显示了如何捕获和处理异常。最后的实验包括**CCS**中**Scripting Console**的使用以及如何在**DSS**脚本中设置断点。 DSS入门教程到此结束。有关详细信息,请参阅[DSS用户指南](https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html)或**API文档**。 <!-- End of markdown source --> <div id="footer"></div>