开发软件项目代码通常遵循一个相对标准的流程: 1) 通常使用 C++ 或 Java 等高级编程语言写下源代码,并使用您能理解的语言和指令。在一个较大的项目中,通常以许多模块的形式编写代码,以便于理解。 2) 您可以使用软件程序编译器将您的模块组合成一段较长的代码,编译器的功能是将人类可读文本转译为只有微型控制器才能执行的目标代码。 3) 您可以将您的目标代码加载到计算机存储器中,并开始运行您的软件。 4) 软件出现故障。
不用担心,这完全正常。事实上,商用企业级软件每千行代码一般包括 20~30 个错误或程式错误,即便在代码释放之后。“致命”错误是造成程序停止运行的真正原因;非致命错误可使软件执行,但是结果不是您想要的。
如果您的软件程序不是您想要的,那么,下一步该怎么办呢?这就是另一款重要软件程序“调试程序”到来的原因。
调试是一个定位并修补电脑程序代码中的错误代码的一个过程。调试一个软件程序以一段错误的代码开始,它隔离任何问题的来源并进行修补。
调试程序是运行另外一个程序(即您的代码)的程序,使您在代码运行时对其进行一定的控制,并在出现故障时检查特定代码。
调试程序的基本功能
当您执行一个含有错误的程序时,您可能想要做或知道以下几点:
- 出现致命错误时,正在执行的程序程序语句或程序表达式是什么?
- 如果在执行一个函数时出现致命错误,调用该函数的程序行是什么?
- 在执行程序的过程中,特定点的程序变量(包括参数)的值是什么?
- 在程序中的某个点上,评估特定表达式的结果是什么?
- 程序中执行的语句序列到底是什么?
这些功能要求您能够:检查程序数据;获得一张当前运行函数的清单;设置暂停程序执行并检查数据的断点;逐句通过程序语句来了解到底发生了什么。
为了让您深入理解原码的操作,几乎所有的调试程序都以符号或源代码执行。其实,它们制造了一种假象,即您以为您在以源程序而不是它们真正转译的机器代码执行 C++ 或 Java 语句。
调试代码时,通常有必要同时检查多个程序项:运行的代码、微型控制器中的硬件缓存器、具体的存储位置以及断点。如此,您将想要以 GUI 格式显示多个窗口。下面的图 1 显示了一个调试程序的屏幕截图,解释了一些可行特征的亮点。
图 1:Eclipse IDE 调试程序屏幕截屏,显示多个窗口和它们的功能。(来源:莱斯大学)
调试程序的硬件支持
有时,还有另外一个程序“仿真器”,它模拟微型控制器本身,因此,您不需要任何真正的硬件,但对于嵌入式系统,您通常需要在微型控制器开发工具套件或在生产意图板上运行您的代码。
大多数微型控制器专用于简化程序调试,如支持一次一条指令来逐句调试程序的硬件、特殊测试模式和断点支持。
软件工具包
在很多情况下,调试程序与其他软件开发工具绑定在一个工具包中,被称为集成开发环境 (IDE)。许多微型控制器厂商为其产品提供 IDE,但也可从第三方供应商甚至开源社区获得。图 1 显示的 Eclipse IDE 就是一个开源产品。
IDE 可以是独立的产品或(如果源于生厂商)与某个微型控制器的开发硬件绑定在一起。为了帮助您开始调试程序,Arrow 提供了多个生厂商的调试器、开发工具和 IDE。