TI教室 >
应用与设计 >
工业应用 >
工厂自动化与控制系统 >
Logistics Robots >
TI-RSLK 模块 4 - 使用 MSP432 进行软件设计 > 03-TI-RSLK 模块 4 - 讲座视频 - 调试
- 本课程为精品课,您可以登录eeworld继续观看:
- 03-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 语言编程的
简介。
但更重要的是,我希望您能够开发
一组与调试的第一个方面相关的工具,
这个方面被称为函数调试。
它是指测试一个函数,
而且,我们将会为其提供一组输入。
然后我们会将预期输出与给定输入下的实际输出
进行比较。
要做到这一点,我将需要能够
控制执行该函数的执行操作,
并设置它的输入。
而且,我们需要能够观察得到的结果。
希望您喜欢本次实验。
我们下次再见。
课程介绍
共计5课时,1小时11分51秒
猜你喜欢
换一换
推荐帖子
- DSP硬件实现大规模FIR或者乘加算法
- 在FPGA设计中,乘法器大部分使用的是内嵌的DSP硬核,如果系统需要跑很高的时钟频率的话,此时会视综合和布线结果而定来决定pipeline寄存器插在何处。由于FPGA的DSP乘法器具有内部插寄存器的功能,那么可以在乘法器内部插入pipeline,也可以在乘法器输出插入pipeline,当然也可以在最后一级全加器的输入前加pipeline,具体的插入点需要根据关键路径而定...
- fish001 DSP 与 ARM 处理器
- TMS320C6748_UART(1) - 基本知识
- 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。该总线可双向通信,可以实现去全双工传输和接收。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片,通常集成于其他通讯接口的连结上。其原理就是,串并转换和并串转换。 1.UART的工作原理 首先介绍几个定义: &nb...
- fish001 DSP 与 ARM 处理器
- C语言中关键字restrict的用法
- 502 Bad Gateway 502 Bad Gateway openresty ...
- lcofjp TI技术论坛
- MSP430G2超值系列选型
- 502 Bad Gateway 502 Bad Gateway openresty ...
- huang91 微控制器 MCU