如何在 Linux PC 上运行 stm32 单元测试?

Posted

技术标签:

【中文标题】如何在 Linux PC 上运行 stm32 单元测试?【英文标题】:How to run stm32 unit tests on Linux PC? 【发布时间】:2021-06-21 14:29:54 【问题描述】:

我正在尝试在我的 linux 机器上对一些 STM32 代码进行单元测试(使用 unity+ceedling),但是每次我访问任何寄存器时,代码都会失败并出现以下错误:

> Produced no final test result counts in $stdout:
Segmentation fault (core dumped)
> And exited with status: [0] (count of failed tests).
> This is often a symptom of a bad memory access in source or test code

例如此代码将导致 PASSED 1/1(请注意,我正在测试返回 a+b 且与 STM 外围设备无关的函数)。

#include "unity.h"
#include "sum2nums.h"
#include "stm32f4xx.h"

void test_Sum()
    TEST_ASSERT_EQUAL_UINT32(5, Sum(3, 2));

但是这段代码会产生上面提到的错误。

#include "unity.h"
#include "sum2nums.h"
#include "stm32f4xx.h"

void test_Sum()
    GPIOA->MODER = 1U;
    TEST_ASSERT_EQUAL_UINT32(5, Sum(3, 2));

是否有可能以这种方式进行测试,或者我必须使用 QEMU(以及如何在不使用 Eclipse 或任何其他 IDE 的情况下这样做)?请注意,Ceedling 使用 gcc,如果我使用 arm-none-eabi,它会生成 hex 文件,而我无法在我的 PC 上运行它。

【问题讨论】:

【参考方案1】:

如果我理解正确,这个测试框架只是试图用宿主 x86 C 编译器编译你的测试用例并直接运行它们。这将适用于您的测试代码不执行任何特定于硬件的操作,这就是为什么您的第一个测试用例很好的原因,但是一旦您的代码尝试接触硬件,如果该硬件实际上不存在,它就会崩溃,如果您将其作为普通 x86 Linux 进程运行,则显然不是这样。

如果您需要运行访问硬件的测试用例,那么您需要运行它们:

实际上在硬件上,例如通过将开发板插入您的 PC 并使用知道如何交叉编译测试的测试框架,将生成的测试用例二进制文件复制到开发板,运行它并捕获输出。

或者在提供硬件模型的模拟器或模拟器上。 QEMU 是这里的一种可能性,假设它具有您正在使用的电路板模型并且该模型对于您正在运行的任何东西都足够好。同样,您的测试框架需要知道如何交叉编译测试以及如何在模拟器上运行它并捕获输出。

【讨论】:

以上是关于如何在 Linux PC 上运行 stm32 单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

在 STM32H7 上使用 GDB 进行远程调试,无需 PC 连接到评估板

STM32F4-Discovery Board:在 PC 屏幕上从连接的传感器打印数据

理论上如何在STM32F3中实现最大采样率?

在STM32 应用的如何将OSC32_IN和OSC32_OUT设置为其它模式

嵌入式linux与51/430/STM32的嵌入式开发的区别与关联

stm32中断配置出错