首页 > 应用与设计 > 电器 > Service Robots > 服务型机器人 > TI机器人系统学习套件(TI-RSLK) >

服务型机器人

最新课程

热门课程

TI-RSLK 模块 4 - 讲座视频 - 调试

大家好,我是 Jon Valvano。 在本视频中, 我们将讨论 如何在 432 上进行调试。 具体来说, 本讲座将会 专注于一些 与调试相关的 基本理论。 那么,在本实验中, 我们将使用或学习 一种被称为 函数调试的技术。 函数调试技术正如 其字面含义, 我们将会测试一个函数。 为了测试该函数, 我们将会 为其提供 一组输入。 然后我们 将会在头脑中 思考将会出现的 预期输出。 然后我们会将该输出 与实际输出进行比较。 通过这种方法, 我们将能够 测试我们的函数 是否正确运行。 我们将学习 单步执行和断点等 调试技术, 并使用调试器 观察输入和输出。 您将要测试的 其中一个函数是 用以实现 模数转换的 双曲线非线性 转换函数。 尤其是,如果您得到的 值是 7000,那么我们期望 得到的是 200 毫米。 在这里,您不会在 本课程中这么早的阶段 就拥有实际的模数转换器。 但是我们将会 开发一个软件。 更重要的是, 教您如何 调试或测试该软件的 一小部分。 好,让我们开始吧。 调试的整体思路 可融合为以下两个 概念。 一个是控制环境。 也就是说, 我将要控制两件事情。 我将要控制 软件执行什么, 或者说,我的 程序在哪里执行。 第二个要控制的是, 系统会将哪些数据 视为输入。 函数调试的 第二个方面 是可观察性。 也就是说, 能否进行观察-- 我能不能看到输入。 能不能知道我的 程序在哪里执行。 以及能不能看到 实际的输出。 在这个特定实验中, 我们将会学习 使用调试器的技巧, 以便能够执行 上面所说的操作。 好的,举个例子, 我们将会 使用一种叫做 稳定化的技术。 通过该技术, 我可以提供固定的-- 换句话说, 我可以指定、确定 和设置执行我的 程序时的输入值。 也就是说,这是调试的 一个方面,称为控制。 要实现该目标,一种方法是 在这里创建一个缓冲器。 您可以在这里 看到一个缓冲器, 这里是您的模式转换器 在后续实验中可能实际上 会看到的一组数字, 共 16 个。 也就是说,您可能会 调用模数转换器, 得到数字 7,131。 然后,您会在这里 调用这个函数。 这便是我们将要 测试的函数。 因此,您可以在此处看到, 我将设置输入值-- 我将把输入值 固定到 16 个 可能的值 组成的序列中。 而且我知晓 其中的每一个值-- 因此,0、1、2、3、4、5、6、7, 0、1、2、3、4、5、6、7。 7,000 的预期 转换值为 196 毫米。 接下来,我将会 设置输入, 调用或测试您的函数-- 不是测试整个机器人, 而是测试这一个函数-- 查看得到的答案, 然后在这里 对实际输出和 预期输出进行比较。 如果您的软件 跟我的一样好用, 二者的差值在正负 1 之间, 或等于 0, 我们就会说, 这个软件足够好。 如果差值大于 1 或 小于负 1, 我们就会将其 归类为错误, 并且说您的程序 无法正常工作。 所以这个 主程序示例 是关于函数 转换的稳定化。 这意味着, 因为当您的程序无法正常工作时, 您会回去重新运行该程序, 所以,您会看到, 我会在每次输入后 得到相同的输出。 这个过程被称为 确定性。 并非所有的软件 都需要确定性。 但是这个特定的 函数是需要的。 也就是说,如果我再次调用-- 运行该函数,并为其提供 完全相同的输入, 我将会得到完全相同的 输出和完全相同的 错误数量。 这意味着,如果我对 这个函数进行更改, 并重新运行该函数, 那么输出中的改变值 将会是软件中的 改变值的函数。 这是我们通过 推进输入的稳定化 而实现的 一个重大成果。 那么,我是从哪里得到 这些值的呢? 尤其是,您可以看到 它们在 100 到 800 毫米的 范围内均匀分布。 投入实际使用后, 这将会是传感器的 典型范围。 我们还可以做到的 一件事情就是选择 邻近极值的值。 如果我们知道客户 如何使用我们的系统, 我们就可以为系统 选择适当的值, 这是该数据的 可能情况之一。 有些客户可能会 存在不当操作。 例如,如果您在这里插入 0, 会出现什么情况? 这种事情根本不可能发生, 但是您可以对其进行测试。 如果这应该是 一个 14 位数字, 而我输入了一个 15 位数字, 会出现什么情况? 我可以观察 系统在不当输入 以及恰当输入时的行为。 临界情况是指 您知道会变得 比较困难的情况。 例如,如果您的 系统作出了 如下决策: 不管输入是多少, 只要大于 100, 您便会执行一个操作。 如果小于或等于 100, 则执行另外一个操作。 那么,当输入 从 99、100 过渡到 101 时,您知道虽然 输入的变化量仅为 1, 但是,输出, 也就是结果 在这个分界线或者拐角上 应该是不同的。 因此,这便是我们 所说的临界情况。 综上所述, 在本实验中, 我们将会针对该程序 进行函数调试。 这是函数调试 过程中的一个示例, 其中输入是已知的。 我们知道预期的输出。 然后,我们会测量-- 我们运行该程序, 测量输出, 然后,对两者进行比较。 我们从哪里获得测试数据呢? 您可以自己生成。 您可以让实际的机器人运行一次, 然后使用实际的数据, 但是之后重复 使用相同的数据。 因此,我们可用于生成 数据的一种方法是 使用所谓的测试用例 或者由可能输入值 组成的测试库, 这样我就可以像在 前面的示例中一样, 一遍又一遍地运行测试库。 另外一种方式是 了解存在的问题, 然后生成我称之为临界情况 或困难情况的数据。 那么,您将会看到另外 一个您必须解决的程序, 它设置了 一系列我知道 比较困难的数字。 然后,让您的软件 对这种情况进行分类。 然后,检查您的 答案是否正确。 通过这种方式, 您无需测试所有 可能的数据,即可验证 系统是否能正常工作。 所以,关于控制, 我们能做的另外一件 事情就是决定 执行什么。 这是特殊测试 main 函数的一个示例, 在该示例中,我不是 运行整个机器人, 而是测试这里的 这个函数。 这是您在实验 4 中 必须编写的函数。 我们将会测试该函数。 如果您有一个机器人, 那么您要做的事情之一 便是设置断点。 您单击这行代码, 就可以设置断点。 您对调试器说,嘿, 为什么不运行到这个点呢。 这样,您就可以在这里 建立一个断点。 当您点击 go 语句时, 它便会向下执行。 然后,第一次到达 这里后,它会停止。 停止后,您便可以 进行单步执行。 单步执行即每次 执行一行代码。 如果您执行步越, 这会一次执行一行 C 代码。 如果调用函数, 则会进入函数。 在步越中,这是一行。 如果遇到函数, 它会执行整个函数。 这是步越的运作方式。 步入跟单步执行有些类似。 如果遇到函数, 它会进入函数调用, 并在其中执行。 步出是在您执行步入后 执行的一种操作。 如果您具有第 1 行、 第 2 行、某个函数 调用、第 3 行。 在调用的函数中, 则有第 A 行、第 B 行-- 这些行代表 C 代码行-- return。 如果我单步执行-- 让我们首先进行单步执行。 如果我单步执行,它会向前一步-- 让我们只是单步执行、执行、 执行、执行、执行、执行、执行。 这便是单步执行 和步入的运行方式。 步越,如果我执行步越, 它将会执行这个, 执行这个。 然后,我再一次 点击步越, 它将会执行这个这一部分, 在这里结束。 所以我点击步越三次, 之后到达这个点。 步出是,如果我恰巧 在函数中的这个位置, 如果我执行步出, 它会执行函数的 剩余部分, 并返回到这一点。 同样,为了控制 执行什么, 我可以设置测试 main 函数。 我们还可以设置断点, 然后执行至特定的点。 为了构建输入, 我可以-- 不是从实际的 传感器收集输入, 包括左侧、 中间和右侧的 传感器-- 我将会 从数组中提取数据。 好了,我们已经 讨论了控制方面, 接下来我们讨论一下可观察性。 现在,包括 Code Composer Studio 在内的 大多数调试器中 都有一个称为 监控窗口的东西。 在调试器中, 我可以查看 全局变量。 只需单击该变量, 将其添加到监控窗口中即可。 而且,我可以将 该监控窗口设置为 在要求时进行 刷新或定期刷新-- 这便是我可以对全局 变量所做的操作。 这是我可以在监控窗口中 查看的永久性变量。 针对局部变量, 有一个单独的窗口。 因此,通过调试器, 您也可以看到 局部变量。 如果您真的了解 计算机是如何工作的, 那么您可能 就能看懂寄存器。 特别是,我可以 查看堆栈指针。 我可以看到 堆栈所在的位置。 我可以看到程序计数器, 看到其位置。 连接寄存器-- 这是您的系统内的寄存器-- R0 是您传入的 首个参数。 而且 R0 还是 您传回的最后一个、 也是唯一一个参数。 实验 10 中将会发生-- 这里是实验 4。 但在实验 10 中,我们将会 学习一个叫做转储的过程。 我将会采用 一个数组。 这个数组可能存储在 RAM 中。 它可能会是一个较小的数组。 或者,可能实际上存储在 ROM 中。 此时则可能会是一个较大的数组。 当程序运行时, 我会将数据放入数组中。 这便是转储。 这样做的优点是 速度非常快。 因此,虽然我也 跟你们一样在前面 进行了编程,而且知道 该如何做, 不管是 printf、cout, 还是由您的编译器 决定的其他形式, 但是,在这节课中, 我们通通都不会采用。 我们不使用 printf, 而只是将数据转储到数组中。 当然,这里是有 printf 的。 因此,如果您想 执行 printf, 您实际上可以输出到 UART。 而且,如果您已经 将 USB 连接器连接到了 笔记本电脑,那么 您可以运行终端程序, 例如 PuTTY,甚至是 TExaSdisplay,而且 可以查看来自串行端口 UART 的输出, 就像使用 printf 时一样。 机器人现在无法 实现这一功能, 因为要连接 USB 才可以。 那么,如果没有 USB, 也没有打印机, 我们要做的是, 在机器人上连接 一些设备,来帮助 我们观察它的行为。 LED 便是其中 最简单的设备之一, 因为 LED 不会让您的 机器人不撞到墙上。 LED 不能 帮您决定做什么。 它只是一点点亮光。 您可以使其以不同的颜色闪烁, 将其打开、关闭, 用它来观察 您的软件在想什么。 蓝色光可能 代表一种情况, 绿色光则可能 代表另外一种情况。 实验 11 是一个 液晶显示屏。 同样,它也不能帮助您的 机器人避免撞到墙上。 但它能帮您显示信息。 所以,您可以将信息 显示在液晶显示屏上, 在机器人四处走动时, 查看液晶显示屏, 将其作为一种监控方式-- 以物理方式查看 软件在想什么。 同样,这也需要 两个方面的调试。 控制会设定输入 以及该执行什么。 可观察性则是-- 换句话说, 如果您有调试器,您可以 在监控窗口中查看其操作。 如果机器人沿跑道运动, 您可以将数据转储到 RAM 中, 然后过后再查看 RAM。 如果您没有 运行机器人, 您可以连接 USB 线缆, 在 PC 上查看 串行端口的输出。 但是,如果您正在 运行机器人, 我们将使用 发光二极管和 液晶显示屏等设备, 来观察机器人在想什么。 总之,本实验是一个 有关 C 语言编程的 简介。 但更重要的是, 我希望您能够开发 一组与调试的第一个 方面相关的工具, 这个方面被称为 函数调试。 它是指测试 一个函数, 而且,我们将会为其 提供一组输入。 然后我们会将预期输出 与给定输入下的实际输出 进行比较。 要做到这一点, 我将需要能够 控制执行该函数的 执行操作, 并设置它的输入。 而且,我们需要能够 观察得到的结果。 希望您喜欢本次实验。 我们下次再见。 314

大家好,我是 Jon Valvano。

在本视频中, 我们将讨论

如何在 432 上进行调试。

具体来说, 本讲座将会

专注于一些 与调试相关的

基本理论。

那么,在本实验中,

我们将使用或学习 一种被称为

函数调试的技术。

函数调试技术正如 其字面含义,

我们将会测试一个函数。

为了测试该函数, 我们将会

为其提供 一组输入。

然后我们 将会在头脑中

思考将会出现的 预期输出。

然后我们会将该输出 与实际输出进行比较。

通过这种方法, 我们将能够

测试我们的函数 是否正确运行。

我们将学习 单步执行和断点等

调试技术, 并使用调试器

观察输入和输出。

您将要测试的 其中一个函数是

用以实现 模数转换的

双曲线非线性 转换函数。

尤其是,如果您得到的 值是 7000,那么我们期望

得到的是 200 毫米。

在这里,您不会在 本课程中这么早的阶段

就拥有实际的模数转换器。

但是我们将会 开发一个软件。

更重要的是, 教您如何

调试或测试该软件的 一小部分。

好,让我们开始吧。

调试的整体思路 可融合为以下两个

概念。

一个是控制环境。

也就是说, 我将要控制两件事情。

我将要控制 软件执行什么,

或者说,我的 程序在哪里执行。

第二个要控制的是, 系统会将哪些数据

视为输入。

函数调试的 第二个方面

是可观察性。

也就是说,

能否进行观察--

我能不能看到输入。

能不能知道我的 程序在哪里执行。

以及能不能看到 实际的输出。

在这个特定实验中, 我们将会学习

使用调试器的技巧, 以便能够执行

上面所说的操作。

好的,举个例子, 我们将会

使用一种叫做 稳定化的技术。

通过该技术, 我可以提供固定的--

换句话说, 我可以指定、确定

和设置执行我的 程序时的输入值。

也就是说,这是调试的 一个方面,称为控制。

要实现该目标,一种方法是 在这里创建一个缓冲器。

您可以在这里 看到一个缓冲器,

这里是您的模式转换器 在后续实验中可能实际上

会看到的一组数字, 共 16 个。

也就是说,您可能会 调用模数转换器,

得到数字 7,131。

然后,您会在这里 调用这个函数。

这便是我们将要 测试的函数。

因此,您可以在此处看到, 我将设置输入值--

我将把输入值 固定到 16 个

可能的值 组成的序列中。

而且我知晓 其中的每一个值--

因此,0、1、2、3、4、5、6、7, 0、1、2、3、4、5、6、7。

7,000 的预期

转换值为 196 毫米。

接下来,我将会 设置输入,

调用或测试您的函数--

不是测试整个机器人, 而是测试这一个函数--

查看得到的答案, 然后在这里

对实际输出和 预期输出进行比较。

如果您的软件 跟我的一样好用,

二者的差值在正负 1 之间, 或等于 0,

我们就会说, 这个软件足够好。

如果差值大于 1 或 小于负 1,

我们就会将其 归类为错误,

并且说您的程序 无法正常工作。

所以这个 主程序示例

是关于函数 转换的稳定化。

这意味着,

因为当您的程序无法正常工作时, 您会回去重新运行该程序,

所以,您会看到, 我会在每次输入后

得到相同的输出。

这个过程被称为 确定性。

并非所有的软件 都需要确定性。

但是这个特定的 函数是需要的。

也就是说,如果我再次调用--

运行该函数,并为其提供 完全相同的输入,

我将会得到完全相同的 输出和完全相同的

错误数量。

这意味着,如果我对 这个函数进行更改,

并重新运行该函数, 那么输出中的改变值

将会是软件中的 改变值的函数。

这是我们通过 推进输入的稳定化

而实现的 一个重大成果。

那么,我是从哪里得到 这些值的呢?

尤其是,您可以看到

它们在 100 到 800 毫米的

范围内均匀分布。

投入实际使用后, 这将会是传感器的

典型范围。

我们还可以做到的 一件事情就是选择

邻近极值的值。

如果我们知道客户 如何使用我们的系统,

我们就可以为系统 选择适当的值,

这是该数据的 可能情况之一。

有些客户可能会 存在不当操作。

例如,如果您在这里插入 0, 会出现什么情况?

这种事情根本不可能发生, 但是您可以对其进行测试。

如果这应该是 一个 14 位数字,

而我输入了一个 15 位数字, 会出现什么情况?

我可以观察 系统在不当输入

以及恰当输入时的行为。

临界情况是指

您知道会变得 比较困难的情况。

例如,如果您的 系统作出了

如下决策: 不管输入是多少,

只要大于 100, 您便会执行一个操作。

如果小于或等于 100, 则执行另外一个操作。

那么,当输入 从 99、100

过渡到 101 时,您知道虽然 输入的变化量仅为 1,

但是,输出, 也就是结果

在这个分界线或者拐角上

应该是不同的。

因此,这便是我们 所说的临界情况。

综上所述, 在本实验中,

我们将会针对该程序 进行函数调试。

这是函数调试 过程中的一个示例,

其中输入是已知的。

我们知道预期的输出。

然后,我们会测量--

我们运行该程序, 测量输出,

然后,对两者进行比较。

我们从哪里获得测试数据呢?

您可以自己生成。

您可以让实际的机器人运行一次, 然后使用实际的数据,

但是之后重复 使用相同的数据。

因此,我们可用于生成 数据的一种方法是

使用所谓的测试用例 或者由可能输入值

组成的测试库,

这样我就可以像在 前面的示例中一样,

一遍又一遍地运行测试库。

另外一种方式是 了解存在的问题,

然后生成我称之为临界情况 或困难情况的数据。

那么,您将会看到另外 一个您必须解决的程序,

它设置了 一系列我知道

比较困难的数字。 然后,让您的软件

对这种情况进行分类。

然后,检查您的 答案是否正确。

通过这种方式, 您无需测试所有

可能的数据,即可验证 系统是否能正常工作。

所以,关于控制, 我们能做的另外一件

事情就是决定 执行什么。

这是特殊测试 main 函数的一个示例,

在该示例中,我不是 运行整个机器人,

而是测试这里的 这个函数。

这是您在实验 4 中 必须编写的函数。

我们将会测试该函数。

如果您有一个机器人, 那么您要做的事情之一

便是设置断点。

您单击这行代码, 就可以设置断点。

您对调试器说,嘿, 为什么不运行到这个点呢。

这样,您就可以在这里 建立一个断点。

当您点击 go 语句时,

它便会向下执行。

然后,第一次到达 这里后,它会停止。

停止后,您便可以 进行单步执行。

单步执行即每次 执行一行代码。

如果您执行步越,

这会一次执行一行 C 代码。

如果调用函数, 则会进入函数。

在步越中,这是一行。

如果遇到函数, 它会执行整个函数。

这是步越的运作方式。

步入跟单步执行有些类似。

如果遇到函数, 它会进入函数调用,

并在其中执行。

步出是在您执行步入后 执行的一种操作。

如果您具有第 1 行、 第 2 行、某个函数

调用、第 3 行。

在调用的函数中, 则有第 A 行、第 B 行--

这些行代表 C 代码行--

return。

如果我单步执行--

让我们首先进行单步执行。

如果我单步执行,它会向前一步--

让我们只是单步执行、执行、 执行、执行、执行、执行、执行。

这便是单步执行 和步入的运行方式。

步越,如果我执行步越, 它将会执行这个,

执行这个。

然后,我再一次 点击步越,

它将会执行这个这一部分, 在这里结束。

所以我点击步越三次, 之后到达这个点。

步出是,如果我恰巧 在函数中的这个位置,

如果我执行步出, 它会执行函数的

剩余部分, 并返回到这一点。

同样,为了控制 执行什么,

我可以设置测试 main 函数。

我们还可以设置断点, 然后执行至特定的点。

为了构建输入, 我可以--

不是从实际的

传感器收集输入,

包括左侧、 中间和右侧的

传感器-- 我将会 从数组中提取数据。

好了,我们已经 讨论了控制方面,

接下来我们讨论一下可观察性。

现在,包括 Code Composer Studio 在内的

大多数调试器中 都有一个称为

监控窗口的东西。

在调试器中, 我可以查看

全局变量。

只需单击该变量, 将其添加到监控窗口中即可。

而且,我可以将 该监控窗口设置为

在要求时进行 刷新或定期刷新--

这便是我可以对全局 变量所做的操作。

这是我可以在监控窗口中 查看的永久性变量。

针对局部变量, 有一个单独的窗口。

因此,通过调试器, 您也可以看到

局部变量。

如果您真的了解 计算机是如何工作的,

那么您可能 就能看懂寄存器。

特别是,我可以 查看堆栈指针。

我可以看到 堆栈所在的位置。

我可以看到程序计数器, 看到其位置。

连接寄存器-- 这是您的系统内的寄存器--

R0 是您传入的 首个参数。

而且 R0 还是 您传回的最后一个、

也是唯一一个参数。

实验 10 中将会发生--

这里是实验 4。

但在实验 10 中,我们将会 学习一个叫做转储的过程。

我将会采用 一个数组。

这个数组可能存储在 RAM 中。

它可能会是一个较小的数组。

或者,可能实际上存储在 ROM 中。

此时则可能会是一个较大的数组。

当程序运行时, 我会将数据放入数组中。

这便是转储。

这样做的优点是 速度非常快。

因此,虽然我也

跟你们一样在前面 进行了编程,而且知道

该如何做, 不管是 printf、cout,

还是由您的编译器 决定的其他形式,

但是,在这节课中, 我们通通都不会采用。

我们不使用 printf, 而只是将数据转储到数组中。

当然,这里是有 printf 的。

因此,如果您想 执行 printf,

您实际上可以输出到 UART。

而且,如果您已经 将 USB 连接器连接到了

笔记本电脑,那么 您可以运行终端程序,

例如 PuTTY,甚至是 TExaSdisplay,而且

可以查看来自串行端口

UART 的输出, 就像使用 printf 时一样。

机器人现在无法 实现这一功能,

因为要连接 USB 才可以。

那么,如果没有 USB, 也没有打印机,

我们要做的是, 在机器人上连接

一些设备,来帮助 我们观察它的行为。

LED 便是其中 最简单的设备之一,

因为 LED 不会让您的 机器人不撞到墙上。

LED 不能 帮您决定做什么。

它只是一点点亮光。

您可以使其以不同的颜色闪烁, 将其打开、关闭,

用它来观察 您的软件在想什么。

蓝色光可能 代表一种情况,

绿色光则可能 代表另外一种情况。

实验 11 是一个 液晶显示屏。

同样,它也不能帮助您的 机器人避免撞到墙上。

但它能帮您显示信息。

所以,您可以将信息 显示在液晶显示屏上,

在机器人四处走动时,

查看液晶显示屏, 将其作为一种监控方式--

以物理方式查看 软件在想什么。

同样,这也需要 两个方面的调试。

控制会设定输入 以及该执行什么。

可观察性则是-- 换句话说,

如果您有调试器,您可以 在监控窗口中查看其操作。

如果机器人沿跑道运动, 您可以将数据转储到 RAM 中,

然后过后再查看 RAM。

如果您没有 运行机器人,

您可以连接 USB 线缆, 在 PC 上查看

串行端口的输出。

但是,如果您正在 运行机器人,

我们将使用 发光二极管和

液晶显示屏等设备,

来观察机器人在想什么。

总之,本实验是一个 有关 C 语言编程的

简介。

但更重要的是, 我希望您能够开发

一组与调试的第一个 方面相关的工具,

这个方面被称为 函数调试。

它是指测试 一个函数,

而且,我们将会为其 提供一组输入。

然后我们会将预期输出 与给定输入下的实际输出

进行比较。

要做到这一点, 我将需要能够

控制执行该函数的 执行操作,

并设置它的输入。

而且,我们需要能够 观察得到的结果。

希望您喜欢本次实验。

我们下次再见。 314

视频报错
手机看
扫码用手机观看
收藏本课程

相关下载

查看全部

视频简介

TI-RSLK 模块 4 - 讲座视频 - 调试

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:17:27
在MSP432上通过控制装置(连接、断点)来学习调试,观察变量和泛函数的调试。
已有7人参与了讨论去论坛跟帖交流
new
关闭广告