函数指针未赋值导致HardFault

函数指针未赋值导致HardFault

我有一个结构体如下

typedef struct
{
    void (*initialize_interrupt)(void);
#if (PCAP04_IIC_EN == 0)
    void (*initialize_spi)(void);
    uint8_t (*spi_transmit_byte)(uint8_t byte);      // 返回0表示成功,其他为失败
    uint8_t (*spi_receive_byte)(uint8_t *data_byte); // 返回0表示成功,其他为失败
    void (*spi_select_device)(void);
    void (*spi_deselect_device)(void);
#elif (PCAP04_IIC_EN == 1) // TODO - 目前没有上拉电阻,没法测试IIC,后续再写
    void (*initialize_i2c)(void);

    uint8_t (*iic_pacp04_transmit_data)(uint8_t slave_addr, uint8_t *data, uint16_t len);
    uint8_t slave_addr;

#endif // PCAP04_IIC_EN

    uint32_t conversion_results[PCAP04_RD_RESULT_COUNT];
    volatile uint8_t flag_conversion; // 转换完成标志

} pcap04_struct_type;

使用SPI模式,有8个参数要填写,但忘记填写spi_receive_byte这个函数指针,导致在程序在调用到spi_receive_byte​这个函数时直接导致单片机进入HardFault。

// 后续写个初始化这个的函数,当有些函数没有填指针时会导致野指针,直接让程序hardfault
pcap04_struct_type g_pcap04_strcut = {.conversion_results = {0},
                                      .flag_conversion = 0,
                                      .initialize_interrupt = pcap04_intn_init,
                                      .initialize_spi = pcap04_spi_init,
                                      .spi_deselect_device = spi_pcap04_ssn_disable,
                                      .spi_select_device = spi_pcap04_ssn_enable,
                                      .spi_transmit_byte = spi_pcap04_transmit_byte};
  1. 最简单的方法就是把对应的函数指针填上,但这个方法很依靠编程者的自觉,我觉得不太靠谱。
  2. 在调用函数指针时对指针进行判断,判断其是否为野指针,我觉得这种方法会让程序变得很复杂繁琐
  3. 写一个初始化结构体的函数,用户初始化完成后调用检查

posted @ 2025-04-24 12:44  CBYHZ  阅读(8)  评论(0)    收藏  举报