函数指针未赋值导致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};
- 最简单的方法就是把对应的函数指针填上,但这个方法很依靠编程者的自觉,我觉得不太靠谱。
- 在调用函数指针时对指针进行判断,判断其是否为野指针,我觉得这种方法会让程序变得很复杂繁琐
- 写一个初始化结构体的函数,用户初始化完成后调用检查
浙公网安备 33010602011771号