使用裸机编程对寄存器进行单元测试

问题描述 投票:0回答:1

我试图通过在包含十六进制数的寄存器上使用库“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.

我正在尝试的可能吗?如果是这样怎么办?如果没有,我可以尝试什么样的测试?我已经为此苦苦挣扎了几个小时。谢谢。

c testing cpu-registers cortex-m bare-metal
1个回答
0
投票

删除以下行:“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
  • 的 NULL 指针
  • |
    不会重置该位

如果你想在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 ;
}
© www.soinside.com 2019 - 2024. All rights reserved.