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

服务型机器人

最新课程

热门课程

TI-RSLK 模块 10 - 讲座视频 - 调试实时系统 - SysTick 中断

大家好,我是 John Valvano。 在本视频中,让我们 讨论一下调试。 现在,创建一个复杂 系统很有趣,但我们 需要通过可靠的 方法来测试它。 因此,在本章中, 我们将向您介绍 一些经证实有效的 方法,用于帮助了解 和以可视化方式 显示您的机器人的 行为。 在本视频中, 我们将对调试技巧进行讨论。 我们将讨论转储。 我们将讨论示波器和逻辑 分析仪。 然后,我们将向您 展示一种非常 强大的将数据 转储到 ROM 中的 方法,我很喜欢这种方法。 好的,让我们开始吧。 大家都知道,检测是一个 物理和软件方面的调试术语, 我们使用它 来测试我们的程序。 举例来说,如果我编写 一组类似这样的程序, 然后我把该代码 输入到我的系统中, 用于调试, 那么我将 把这归类为 一个检测。 请注意,存在好的 检测和坏的检测。 因此,我们可以 根据调试本身 对我们尝试测量的 参数的影响,对它们 进行归类 或划分类别。 例如,您可以在这里 看到一个相当简单的 检测,它主要是获取 某些重要的内容 并把它转储到该数组中。 那么,这就是我说的 转储检测的含义。 它要将某些重要的 内容转储到这里。 您可以看到,它将 获取 100 个采样值。 在前 100 次调用它时, 将记录该数据。 然后它停止记录。 但是,如果我想了解它的效果 有多好,或者它的侵入性有多高, 那么我需要检测程序, 以了解执行花费了 多长时间。 那么,执行这些行,一, 二,三,四行 C 代码, 花费了多长时间。 我可以做两件事情之一。 我可以打开 汇编器并查看 它生成的代码。 请注意,在这里, 它获取了 22 条汇编 指令,以执行该转储检测。 然后,一旦我 知道了执行 花费了多长时间,我就 可以得出执行所花费的 时间与转储调用的 时间间隔之间的比率。 例如,如果我每毫秒 调用该检测一次, 那么我可以在这里 查看该比率,看到 执行该代码的时间 与调用它的时间 如果该比率较小,那么 我将把这归类为具有 极低的侵入性。 这是一件好事。 请注意,我们在前一章 已看到,我们可以使用 SysTick 执行测量。 那么,如果您希望 获取 -- 如果您不想 对汇编指令进行 计数并在数据表 查找每条 指令以查看 执行的确切 时长,那么您 可以执行 与我们在 前一章中所学 方法相同的测量。 基本来说,转储通常使用 printf 来执行 可用于任何您 的调试的 上下文,因为 这里没有终端。 那么,我要做的是, 运行机器人, 填充这些数组。 然后,在实时系统 完成之后,我可以 使用调试器以可视化 方式显示该数据。 那么,我稍后将执行它。 正如我们将在 这视频结束时看到的, 如果 100 个点不够,我们 实际上可以使用闪存 ROM 来提供额外存储 和非易失性存储。 那么我们稍后将看到它。 好的,我们在前一张 幻灯片中看到过转储检测。 现在,我们可以执行 转储检测的两个变体, 我把其中一个 称为连续变体。 在前面的转储中, 它存储了前 100 个点。 但该转储,正如您看到的, 将存储最后 32 个元素,因为 它所做的是,当缓冲区 已满时,它不会停止。 它会翻转并 继续存储。 因此,如果我查看 该数组,我查看该索引 I, 我现在能够以可视化方式 显示前面的最近 32 个元素。 这可能比另一种 方法更重要。 现在,您应该记得,有关 调试的重要策略是一个 包含 2 个步骤的过程。 我们需要能够控制 我们的软件的执行 内容和位置。 在这里,在本次 讲座中,我们讨论的 是可观察性。 我们需要能够 看到正在发生什么。 现在,转储和 print 语句的问题在于, 它们会生成大量的信息, 这些信息是如此之多, 以至于我们没有 兴趣去查看它。 因此,管理 复杂系统的 关键策略之一是一个 称为筛选器的东西。 这意味着,如果某个 特定的条件为真, 那么我将记录数据。 这样,它将极大地 减少我必须观察的 数据量。 举例来说, 我可能希望知道 恰好在我撞到墙 之前发生了什么, 或者恰好在我 转弯时发生了什么, 或者,如果这样或 那样,会发生什么? 因此,我可以设置一个筛选器。 现在,我可以看到, 筛选器并不比 if 语句复杂。 那么我输入一个 if 语句。 我输入可能发生的 糟糕条件 if。 然后,我将仅在该条件 为真时记录数据。 该经过筛选的数据确实 会使我们要查看的数据 少很多。 我最喜欢的筛选器之一 是“如果它发生变化”。 因此,如果我 在这里有 该参数 x,那么我能够 仅在它发生变化时记录它。 因此,再说一次,这样 一来, 我查看的数据将更少, 从而使我能够更轻松地 观察所发生的事情 并建立相应的模式。 因此,再说一次,对于调试 实时系统而言,转储是一种 非常重要、非常强大的方法, 因为正如我们看到的, 执行它所需要的 时间并不很长。 我们可能需要 做的另一件事 称为评测或 性能调试。 在执行性能调试时, 我对询问某些问题 感兴趣,比如,它在 我的软件中的什么 位置执行? 何时调用了某个函数,是否调用了某个函数, 或者对某个函数进行了多少次调用? 如果对它进行了调用, 执行它需要多长时间? 当我这么做时, 我将要做的是, 确定一个未用于 该实际系统的 I/O 端口。 我将使它成为输出。 然后,我将切换到它, 或者对它进行写入。 那么,在本例中, 端口P2.0 不是系统的一部分。 但是,您可以看到, 当这执行时,我将 得到一个脉冲。 现在,我可以使用它 来测量执行该测试 函数所需的时间。 这个很有趣。 我有两个函数, happy 和 sad。 它们是否相关 并不重要, 但重点是, 我可能希望 知道哪个先执行。 或者我希望知道, 在每两次 happy 执行之间, 执行了多少次 sad? 因此,如果我采用 逻辑分析仪,或者 双通道示波器,然后 查看端口P2.3 好的,端口P2.2这个