代码之家  ›  专栏  ›  技术社区  ›  Norronas

采用裸机编程的寄存器单元测试

  •  0
  • Norronas  · 技术社区  · 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一起工作,我有另一个测试,它与这种类型的返回值一起工作。

    尽管返回值不一定等于我想要测试的值,但当我运行测试时,我会遇到分段错误。以下是错误:

    跑步套件:功能测试 66%:检查:3,失败:0,错误:1 tests/tests.c:31:E:核心:test_LED1_off:0:(在此点之后)接收信号11(分段故障)

    通过删除以下行:“GPIOA_ODR|=(OFF<<LED1);”并将返回值设置为“1”,我不再存在分段故障。我的印象是,当我运行测试时,我的计算机明白我试图访问它自己的内存。

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

    1 回复  |  直到 1 年前
        1
  •  1
  •   Eugene Sh.    1 年前

    删除以下行:“GPIOA_ODR|=(OFF<<LED1);”,然后 将返回值设置为“1”,我不再有分段 过错我的印象是,当我运行测试时,我的电脑 我明白我在试图访问它自己的记忆。

    在您的电脑上,您尝试修改地址处的内存 GPIOA_BASE + 0x14 (更确切地说,您的取消引用指针分配为 GPIOA_BASE+0x14 转换为指针)。调用segfault绝对不是属于您的内存。

    在PC上对STM32寄存器进行的整个测试毫无意义。

    而且

    • OFF << LED1 取消引用UB的NULL指针
    • | 不会重置位

    如果你想在电脑上运行它,你需要一个真正的对象来被指针引用

    #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 ;
    }