我试图通过在包含十六进制数的寄存器上使用库“check.h”来进行单元测试,以检查返回值是否正确。这些寄存器用于对 STM32F030F4 ARM Cortex M0 微控制器进行编程。但是,在运行测试时,我遇到了分段错误。
这是我要测试的功能:
#define GPIOA_BASE 0x48000000
#define GPIOA_ODR (*(volatile uint32_t *)(GPIOA_BASE + 0x14))
#define LED1 (*(volatile uint32_t *)(0))
#define OFF 0UL
uint32_t LED1_off (void) {
GPIOA_ODR |= (OFF << LED1);
return GPIOA_ODR ;
}
这是我的测试:
START_TEST (test_LED1_off) {
ck_assert_int_eq(0x48000014, LED1_off());
}
END_TEST
有关信息,ck_assert_int_eq 函数可与 uint32_t 配合使用,我还有另一个可使用此类型的返回值的测试。
即使返回值不一定等于我想要测试的值,但在运行测试时我会遇到分段错误。这是错误:
运行套件:FunctionsTests 66%:检查:3,失败:0,错误:1 test/tests.c:31:E:Core:test_LED1_off:0:(在此之后)收到信号 11(分段错误)
删除以下行:“GPIOA_ODR |= (OFF << LED1);" and by setting the return value to "1", I no longer have a segmentation fault. I have the impression that when I run my tests, my computer understands that I am trying to access its own memory.
我正在尝试的可能吗?如果是这样怎么办?如果没有,我可以尝试什么样的测试?我已经为此苦苦挣扎了几个小时。谢谢。
删除以下行:“GPIOA_ODR |= (OFF << LED1);" and by setting the return value to "1", I no longer have a segmentation fault. I have the impression that when I run my tests, my computer understands that I am trying to access its own memory.
在您的 PC 上,您尝试修改地址
GPIOA_BASE + 0x14
处的内存(更准确地说,您取消引用由 GPIOA_BASE + 0x14
转换为指针分配的指针)。这绝对不是属于你的内存并引发段错误。
在PC上对STM32寄存器的整个测试完全没有意义。
还有:
OFF << LED1
取消引用 UB|
不会重置该位如果你想在PC上运行它,你需要一个由指针引用的真实对象
#if defined(__x86_64__) || defined(_M_X64)
static uint32_t GPIOA_ODR;
#else
#define GPIOA_BASE 0x48000000
#define GPIOA_ODR (*(volatile uint32_t *)(GPIOA_BASE + 0x14))
#endif
#define LED1 0
#define OFF 1UL
uint32_t LED1_off (void) {
GPIOA_ODR &= ~(OFF << LED1);
return GPIOA_ODR ;
}