TI教室 >
应用与设计 >
工业应用 >
工厂自动化与控制系统 >
Automated Machinery >
TI-RSLK 模块 10 - 调试实时系统 > 讲座视频 - 调试实时系统 - 理论
- 课程目录
- 相关资源
- 课程笔记
大家好,我是 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这个 --
端口P2.3是那个。
我现在可以及时地以可视化方式显示该程序的行为。
因此,我可以询问一些问题,比如,这是在 sad
之前发生的 happy。
我可以测量执行 happy所花费的时间、执行
sad 所花费的时间。
我们再次使用逻辑分析仪。
我们要将这称为具有极低的侵入性,
因为与该执行调用之间的时间
相比,执行该行代码
所花费的时间非常短。
那么,这是评测,或告诉我软件的
哪个部分正在运行,以及软件的各个部分
之间的相对运行顺序。
这种评测中可能出现的
问题之一是我们在中断中
看到的一个东西。
这个东西称为关键部分。
我们将在中断部分中讨论这个话题。
但可以这么说,它是对全局变量的
读取、修改、写入访问 --
在本例中,它是端口 2 --
输出可能会导致问题。
我们可以做的用来消除关键部分的事情之一是
位带。
因此,如果我们查看 --
这是所有 ARM处理器所做的事情。
如果我们查看输出寄存器 --
这是端口 2 位输出的8 位输出寄存器 -- 我们
把它分为两个部分。
我们有顶部部分和底部部分。
我获取这里的底部部分。
我获取这里我感兴趣的位编号。
然后我执行该函数。
我们把这视为一个常数。
我始终采用 42,000。
我乘以 -- 这是一个常数。
我把该 n 值乘以 32。
我获取这里的位置,然后把它乘以 44。
现在,它为我提供了该特定引脚的另一个
地址,一个位带地址。
因此,您可以看到这里的定义会创建一个地址,好的,
一个 8 位量的地址,这样,如果我向该地址
写入 1 或 0,它将设置或清除端口 2 位 2。
因此,我可以使用位带执行具有极低侵入性的
调试检测。
现在,这是一种三次切换技术。
例如,如果您在您的示波器上
或在您的逻辑分析仪上查看端口 2 位 2,您会
看到以下行为。
如果发生一个中断,
LED 将改变方向。
它几乎立即改变方向。
因此,一,二,它运行中断服务例程的主体,
三,去那里。
然后,我们有一个较长的延迟,直到另一个中断发生。
因此,该技术的优势是,它不仅
告诉我这里的中断之间的时间,
而且还告诉我执行该服务的时间。
然后,会在此时测量该中断
服务例程的主体。
那么,这是另一个评测技巧,它
称为三次切换技术。
因此,我要将它切换三次,从而不仅以可视化方式
显示它是否发生,或发生之间的间隔
时间,还显示实际运行中断服务例程
花费了多长时间。
我们确实有 64k 的 RAM,因此,如果您需要,有很多
用于转储的空间。
但是,如果您耗尽RAM,我们可以对
该微控制器采用的功能之一实际上是
将 ROM 用作转储空间。
那么,该实验讨论以下过程。
我将采用该 ROM 的一半,并以常规方式
把我的程序放置到这里。
然后,我将采用该 ROM 的另一半 --
您可以看到其中的一半是 2,000 至 3FFF --
这是闪存 ROM。
那么,这是只读闪存。
您会说,嘿,John,我以前认为它是只读的。
嗯,我们有技巧。
如果我们知道相关的方法,我们可以对该只读存储器进行写入。
因此,我要把数据放置在这里。
我要把我的转储数据放置在这里。
现在,它具有非易失性的优势。
因此,我可以绕着赛道一圈一圈不停地运行我的机器人。
然后,我可以关闭机器人的电源,
把它移到我的计算机旁,
把我的机器人插入计算机,再次启动
调试器,然后,嘣,所有东西仍在数据中。
我的所有记录数据仍在那里。
这就是这种称为ROM 转储的技术的
美妙之处。
好,那么 ROM 是怎样工作的?
好的,再说一次,它是只读闪存。
它其实是通过这种非常怪异的方式进行工作的。
我们将有 --
它是一个晶体管。
它有 N 沟道和 P 沟道。
这里的有趣之处在于,
如果您考虑具有三个引脚的典型晶体管,
该晶体管的基极应该在这里。
这是基极。
在闪存 ROM 中,基极其实是未连接的。
它是未连接的。
然后,它采用另一个晶体管。
把它上下颠倒。
把这两个基极放在一起。
这是一件怪异的事情。
有人在很久以前想出来的这个方法。
但在这两个基极之间,我们将具有该栅极。
这是晶体管的栅极。
我们将采用该栅极。
我们将在这里放置一个材料。
看到了吗?
就在这里,有两个栅极,一个在这里,一个在这里。
我们将使用一个绝缘层把这两个
栅极放在一起,这样它就不会通过较大的电流。
然后,我们要做的是,我们要把电荷捕获到
该晶体管的基极中。
这就是它具有非易失性的原因。
存在电荷将被定义为 0。
不存在电荷将被定义为 1。
我们将通过该分离,该差异
来确定该 ROM位是否 -- 这是
我的 ROM 存储器中的一个位 --
无论它存储为 1还是 0 都没关系。
这里有几个技巧。
其实,我们可以讨论擦除。
擦除的过程是,
我将获取大量的这些晶体管。
正如您知道的,我将施加电压,
从而使捕获的任何电荷都泄漏出去。
因此,我将从所有栅极中移除所有电荷。
这将导致这个 --
这将导致这个 --
所有这些位被归类为 1。
然后,如果我想把某个位编程为 0 --
再说一次,我不把它编程为 1。
我把它擦除为 1。
我不是仅擦除一个位。
我擦除大量的位,比如所有位。
但是,当我想对它进行编程时,我将
在这里颠倒电流,强制电荷进入这里。
再说一次,擦除将移除电荷。
编程是把电荷转储到这里。
现在,问题在于,擦除非常慢,
需要的时间为毫秒级。
此外,编程也非常慢,需要的时间为毫秒级。
但是,读取的速度和常规存储器一样快,
无论那里有无内容都是这样。
那么,再说一次,ROM是非易失性存储器。
它具有很高的密度,因为您可以看到,
这里针对每个位采用了一个晶体管。
擦除操作是清除 --
把 ROM 中的所有位都设置为 1。
编程操作是根据需要把各个位
清除为 0。
现在,我需要向您讲授的ROM 物理原理就到此结束了。
实际上,为了执行该实验,在这里
您只有两个要担心的函数。
您有一个 erase函数,它将擦除 --
您应该还记得,我说过您会擦除大量的位。
事实上,您将擦除 4,096 个字节。
通过向该函数发送一个地址,
一次可以擦除4,096 个字节。
然后,嘣,4,096 个字节全部变为 1。
这样一来,您执行一次就可以初始化您的转储。
但是,当我想对它进行编程时,我将设置一个数组。
那么,这里的函数 --
这里的参数具有一个包含 32 位数据的数组,
一个指向该数组的指针。
它具有您想对其进行写入的 ROM 中的地址。
然后,该 32 位数字将写入您希望发生的事件。
然后,它将获取该 RAM 阵列 --
获取该 RAM 阵列,然后把它转储到闪存 ROM 中。
再说一次,执行这里的操作需要的时间
为毫秒级。
不过,这种技术非常强大,
可用于在计算机上存储数据。
好,总之,我们讨论了
调试检测。
检测可能是物理检测,
比如您的逻辑分析仪或示波器,
也可能是软件检测,
比如切换位或转储到阵列中。
因此,我们切换了位并查看了逻辑分析仪。
在前一章中,我们使用了 SysTick 来测量
某件事情发生需要多长时间。
因此我们可以测量时间 --
某件事的起始时间。
我们采用某个函数 --我们希望知道执行
要花费多长时间。
我们调用 SysTick并再次查看计时器。
将这两者相减和 24 位模式。
该 11 个周期是校准,因为
需要一定量的时间 x -- 需要
一定量的时间来实际
执行这两行代码。
这将减去它。
因此,举例来说,如果这为空,
该函数将返回 0。
好,我们讨论了 ROM。
ROM 比较有趣。
对于只读闪存,我们可以擦除它,
这会把所有位都设置为 1。
我们可以通过在我们想执行它的位置插入 0
来对它进行编程。
这两者很慢。
读取它很快。
好,希望您喜欢本次实验。
这是一个强大的实验,可帮助您提高您的
调试技能。
课程介绍
共计4课时,1小时4分14秒
猜你喜欢
换一换
推荐帖子