如何在嵌入式系统中进行测试设计

Alexsander Tamari
|  已创建:October 17, 2023  |  已更新:July 1, 2024
嵌入式系统测试

无论您是在设计高速PCB还是复杂的嵌入式系统,都需要进行某种级别的测试。对于高速和RF系统,这通常意味着与VNA或示波器测量相比的仿真。对于嵌入式软件和固件,测试步骤可能会有很大不同。实际上,在原型设计中,您可以做一些事情来帮助您加速测试过程并消除使用万用表探测的需要。

在本文中,我将向您展示一些简单的技巧,可以使测试和调试原型变得更加容易。这意味着采取针对测试的设计方法,并将其应用于软件和硬件。这里有一个提示:嵌入式系统测试的最佳路径不仅仅是放置测试垫或测试点。

嵌入式硬件中的针对测试的设计

在PCB行业中,我们有很多流行词,而“针对测试的设计”通常与更广泛的DfX捆绑在一起。许多设计师在处理运行嵌入式代码的板子的测试时,会采取与测试任何其他板子相同的方法。

这通常意味着设计师会在重要信号上放置许多测试点,但可能不会有太多其他内容。许多嵌入式原型将开始看起来像Arduino开发板,其中主处理器上的所有可想到的内容都被引出到针脚头和测试点。

嵌入式系统测试
开发板总是将针脚头作为标准实践引出到PCB上,以便进行连接。然而,您需要自己将针脚连接在一起,以便您的MCU能够从外设或其自身的信号中读取信号。

我并不反对在嵌入式系统板上或任何其他板上使用针脚头。但是,在尝试测试和调试板上运行的软件或固件的同时监控每个信号和针脚是困难的。在某些情况下,您必须实际编写一个应用程序来测试您的应用程序。有时,如果您看到设计功能中的错误,根本原因是在您的代码还是在您的PCBA中可能并不总是显而易见的。

在硬件方面,专注于采取这种简化的针对测试的设计方法:

  • 并非所有东西都需要针脚头。如果您实际上计划将其连接到某物或实际上将其测量,则将信号引出到头部。
  • 放置您实际可以使用的连接器。这样您就可以连接到数据采集卡、逻辑分析仪、示波器等。
  • 让软件进行测试。不要忘记,您的嵌入式应用程序可以从外设读取信号,这让您可以在代码中构建测试用例。
  • 您可以在屏幕上查看数据,您只需要连接到您的PC,例如通过串行端口、数据采集卡或专有软件。

这些概念中的一些已经被Ari Mahpour在他关于测试和持续集成的讨论中广泛讨论过了。查看这篇文章以了解更多关于这种方法的信息。如果你想将数据发送回你的电脑,最简单的方法是在你的原型中添加一个USB到串行接口。查看Zach Peterson的这个项目并获取链接设计文件。

嵌入式系统测试
通过USB访问的串行端口对于查看来自嵌入式PCB的数据非常有用。

嵌入式软件中的测试用例

接下来,如果你在系统上运行一个嵌入式应用程序,那么你可以在代码中包含错误处理或测试用例以帮助加速测试。添加与接口的连接,包括插头、测试垫和基本的串行接口,都是帮助你实时监控嵌入式板的重要步骤。目标是看到软件应用程序与硬件并行的行为。

那么,你如何同时监控你的应用程序和硬件的进展呢?借鉴软件开发人员的做法:添加错误处理和消息显示,以显示应用程序中每个功能的状态。这可以简单到显示消息,说明应用程序中重要功能是通过还是失败。编写所有这些错误检查需要一些额外的时间,但在应用程序执行期间,屏幕上的消息指示你的系统正在做什么,可以消除大量的调试工作。

这里有一个例子,展示了如何在C/C++中使用一个简单的函数(称为myFunction())和一个假设的GPIO库来实现这一点。假设你正在使用一个提供了像gpio_init()、gpio_read()等函数的简单GPIO库:

#include
#include   // 用于 std::runtime_error
// 假设的 GPIO 库

namespace GPIO {
    void init(int pin) {
        // 将给定的引脚初始化为输入
        // 该函数是平台特定的
    }

    bool read(int pin) {
        // 读取给定引脚的值(高电平或低电平)
        // 如果是高电平返回 true,低电平返回 false
        // 该函数是平台特定的
        return false;  // 占位符,将依赖于实际硬件
    }
}
 

int main() {
    const int GPIO_PIN = 5;  // GPIO 读取的引脚号(根据您的设置选择)
    GPIO::init(GPIO_PIN);
    double a = 10.0, b = 2.0;
 

    // 如果 GPIO 信号为高电平,将 b 设置为零
    if(GPIO::read(GPIO_PIN)) {
        b = 0.0;
    }
    try {
        double result = myFunction(a, b);
        std::cout << "结果: " << result << std::endl;
    }
    catch(const std::exception& e) {  // 捕获类型为 std::exception 的异常
        std::cerr << "错误: " << e.what() << std::endl;  // 显示错误信息
    }
    catch(...) {  // 捕获其他异常的通用处理程序
        std::cerr << "发生未知错误!" << std::endl;
    }
    return 0;
}

 

如果您的应用程序直接监控信号,您的应用程序可以在其核心功能的每个步骤中打印这些结果。在屏幕上打印这些结果以及您的关键指示信号,将准确告诉您应用程序的进展情况,您无需使用外部设备手动测量板上的每个信号。当然,这需要在设计板时引出一些额外的轨迹到 GPIO,但您可能会发现,一个明显的逻辑错误实际上只是您的 PCB 中的一个简单连接错误。

别忘了,您仍然可以将任何其他需要去探针的信号引出到一个头部。这样,这些信号仍然可以用示波器或数据采集卡进行测量。同时,串行端口将大大简化与应用程序逻辑交互的工作。

无论您想设计什么,您都可以使用 Altium Designer® 中的完整 PCB 设计功能集来实现创新的测试设计实践。为了在当今的跨学科环境中实现协作,创新公司正在使用 Altium 365™ 平台轻松共享设计数据并将项目投入生产。

我们只是略微触及了在 Altium 365 上使用 Altium Designer 的可能性。立即开始您的 Altium Designer + Altium 365 免费试用

关于作者

关于作者

Alexsander担任Altium的技术营销工程师,为团队带来了他沉淀多年的工程专长。他把对电子设计的一腔热情与实践经验相结合,为Altium的营销团队提供了独特的视角。Alexsander毕业于世界排名前20的大学——加州大学圣地亚哥分校,并获得了电气工程学士学位。

相关资源

相关的技术文档

返回主页
Thank you, you are now subscribed to updates.