教学大纲
---------------
**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 **链接(CCS_INSTALL_DIR 是您计算机上CCS的位置,例如,对于Windows上的**CCS**,它可能是C:/ti/ccsv8 / )。
<CCS_INSTALL_DIR>/ccs_base/scripting/docs/GettingStarted.html
![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连接器
* [DSS-Workshop ](./files/DSS-Workshop.zip) 文件夹
记下CCS安装位置和您存储DSS-Workshop 的位置。默认分别存储在C:/ti/ 和 C:/CCS-Workshops/ 。
### 设置
以下步骤是所有实验共同的基本设置。相同的命令提示符窗口可用于多个实验,无需重复进行此设置。
1. 为了便于实验,请确保使用的LaunchPad是唯一连接到计算机的板子。
2. 打开命令提示符或终端窗口,将目录更改为**DSS-Workshop **文件夹。默认位置是**C:/CCS-Workshops/ **。
3. 运行setpath.bat 文件并提供CCS安装的路径作为参数(例如**C:/ti/ccsv8 **)。在路径周围使用引号避免空格问题。
范例:
```text
> setpath "C:/ti/ccsv9/"
```
[[+y OS X和Linux用户 (展开)
不使用setpath.bat ,输入以下命令:
```text
PATH="$PATH:/ccsv/ccs_base/scripting/bin"
```
这样会保证dss.sh 在您的路径当中。 +]]
您可以开始实验了!
### 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 .
myObject.objectMethod(myArgument);
```
Lab 1 — 创建和运行基本DSS脚本
--------------
在本实验中,您将创建一个基本的DSS JavaScript脚本,该脚本将在**SimpleLink CC1352R1 LaunchPad**上加载并运行示例程序(**blinky20.out **)。然后,您将从命令行运行脚本并观察结果。实验室将简要介绍所使用的对象和方法,完整描述可在文档[documentation](#api-documentation)中找到。
### 创建脚本
1. 在您喜欢的文本编辑器中创建一个新文件,并将其保存在**DSS-Workshop/lab1 **目录中,名为**lab1.js **。这是我们将为本实验创建脚本的文件。
{{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安装中脚本示例文件夹中提供的示例**DefaultStylesheet.xsl **文件。要查看样式化的日志文件,建议使用**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. 使用调试会话的目标字段的**connect() **API连接到目标。
```javascript
debugSession.target.connect();
```
{{b **Target**类支持目标执行的方法**(例如`run`,`halt`,`restart`)**,步进和连接/断开目标。}}
11. 将程序(**blinky20.out **)加载至内存中。
```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. 确保在**lab1 **子文件夹中将文件存为**lab1.js **。
[[+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. 将工作文件夹更改至DSS-Workshop/lab1/ 。
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浏览器中打开生成的日志文件**lab1/log.xml **(建议使用Internet Explorer以实现兼容性)。如果正确使用了默认的**XML**样式表,它应该如下图所示:
![An example of a log file styled using DefaultStylesheet.xsl](./images/dss_workshop_log_file.PNG)
请注意,日志文件包含的信息远多于输出到控制台的信息,包括序列号,计时信息和状态消息(因为选择了更详细的跟踪级别)。
Lab 2 — 使用Rhino调试器
--------------
在本实验中,您将使用[Rhino Debugger](https://www.mozilla.org/rhino/debugger.html)调试和修复损坏的DSS脚本。
### 运行范例脚本
1. 在编辑器中打开**lab2 **子文件夹中的范例脚本**lab2a.js **,修改前两个变量以匹配您的安装。保存文件。
2. 如果尚未设置,请打开命令提示符或终端窗口,然后按照[设置部分](#设置)中的说明设置环境。
3. 将目录更改为**lab2 **子文件夹并运行提供的示例脚本。
```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
```
错误消息表明程序加载失败,因为我们没有连接到目标。可以在日志文件**lab2/log.xml **的末尾找到相同的错误消息。
![Log entry that reads 'Error loading "hello.out": Cannot perform operation, target is not connected.'](./images/dss_workshop_connect_error_log.PNG)
这很奇怪,因为在**lab2a.js **的第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()`。将生成的文件保存在**lab2 **子文件夹中的**lab2b.js **。
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 — 捕捉异常
--------------
在本节实验中,您将修改示例脚本以捕获和处理DSS API异常。
1. 在**lab3 **文件夹中打开提供的示例脚本**lab3a.js **文件,然后修改前两个变量以匹配您的安装。保存文件。
2. 如果尚未设置,请打开命令提示符或终端窗口,然后按照**设置**中的说明设置环境。
3. 将目录更改为**lab3 **子文件夹并运行提供的示例脚本。
```text
> dss lab3a.js
```
该脚本将启动LaunchPad的调试会话,并尝试加载并运行示例程序(**modem.out **),但会失败并出现错误。
```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
```
错误消息表明**modem.out **程序不是为我们的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. 将修改后的脚本保存为**lab3 **子文件夹中的**lab3b.js **。
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 — 脚本控制台和断点
---------------
在本实验中,您将了解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/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脚本(完整脚本可以在[建立脚本](#创建脚本)的末尾找到)。将**C:/CCSWorkshops/ **替换为计算机上**DSS-Workshop **文件夹的路径。
```text
js:> loadJSFile(C:/CCS-Workshops/DSS-Workshop/lab1/lab1.js)
```
[[y 检查你的路径
如果遇到错误,请确保脚本控制台和**lab1.js **脚本中使用的所有路径都是正确的,使用正斜杠的完整路径。]]
脚本将被执行并且可以观察到以下内容:
1. 启动调试会话时,CCS将切换到**CCS Debug**模式。
脚本操作将在GUI中可见,但操作可能执行得太快而无法看到。
2. 程序运行时,LaunchPad上的LED将闪烁20次。
3. 当脚本终止调试会话时,CCS将切换到**CCS Edit**模式。
### 设置断点
1. 从**Scripting Console**运行实验2(**lab2b.js **)中的(固定)脚本,如上**从脚本控制台运行脚本**。
```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. 在文本编辑器中打开位于**lab2 **子文件夹中的**hello.c **源文件。记下该行的行号。
```C
printf("Hello World!\n");
```
(The line number should be 7.)
4. 从实验2中打开脚本**lab2b.js **并使用`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. 将生成的脚本保存为**lab4 **子文件夹中的**lab4.js **。
7. 从脚本控制台运行**lab4.js **脚本。
```text
js:> loadJSFile(C:/CCS-Workshops/DSS-Workshop/lab4/lab4.js)
```
CCS将切换到**CCS Debug**模式,目标将在我们设置的断点位置停止,脚本将退出而不终止调试会话。
[[y CCS无法找到来源?
CCS可能无法找到源文件**hello.c **,因为可执行文件是使用不同目录中的源文件构建的。使用**Locate File... **按钮将CCS定向到包含**hello.c **的文件夹(可以在**lab2 **子目录中找到)。]]
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文档**。