我正试图在我的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,它会产生十六进制文件,我不能在我的电脑上运行它。
如果我理解正确的话,这个测试框架只是试图用主机x86 C编译器编译测试用例并直接运行它们。在测试代码不执行任何特定于硬件的操作的情况下,这将起作用,这就是为什么第一个测试用例是好的,但一旦代码试图接触硬件,如果硬件实际上不在,它就会崩溃,而如果你将其作为一个正常的x86Linux进程运行,它显然不会崩溃。
如果你需要运行访问硬件的测试用例,那么你需要运行它们:
-
实际上是在硬件上,例如,通过将开发板插入您的PC,并使用知道如何交叉编译测试的测试框架,将生成的测试用例二进制文件复制到开发板,运行它并捕获输出。
-
或者在提供硬件模型的仿真器或模拟器上。QEMU是一种可能性,假设它有一个你正在使用的董事会模型,并且这个模型对于你正在运行的任何东西都足够好。同样,您的测试框架需要知道如何交叉编译测试,以及如何在模拟器上运行测试并捕获输出。
如果您想在PC上运行它,有一个简单的解决方案。您只需从STM库中复制stm32fxxx.h
标头,然后在该文件中用简单变量替换所有地址。例如:
volatile USART_TypeDef usart0_base;
#define USART0_BASE (&usart0_base) /**< USART0 base address */
现在,您可以更改添加CPU特定include的主标头,并添加一个MOCK或一些定义,这将用这个标头交换硬件寻址的标头,您可以使用计算机GCC进行编译,并在linux上运行(速度更快(。通过这种方式,你基本上嘲笑了硬件,并用简单的内存取代了它。