函数指针,在 STM32 中,我如何理解这些类型句柄?

Function Pointers, In STM32 and how do i understand these Type Handles?

我遇到了一个非常令人困惑的错误,因为我可能在措辞或类型句柄上犯了一个小错误,或者这可能是一个更复杂的问题

基本上我想创建这个函数 Buf_IO(HAL_StatusTypeDef IO) 可以接受两个输入之一 HAL_SPI_Transmit 要么 HAL_SPI_Recieve

这些都定义为

HAL_StatusTypeDef HAL_SPI_Transmit/*or Recieve*/(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

所以在我的代码中我定义了我的函数指针如下

HAL_StatusTypeDef (FuncPtr*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t) = IO;

其中 IO 是我函数的参数 但是由于某种原因我得到了错误

invalid conversion from 'HAL_StatusTypeDef (*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t)' {aka 'HAL_StatusTypeDef (*)(__SPI_HandleTypeDef*, unsigned char*, short unsigned int, long unsigned int)'} to 'void (*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t)' {aka 'void (*)(__SPI_HandleTypeDef*, unsigned char*, short unsigned int, long unsigned int)'}

为清楚起见,这是我在 .cpp 文件中声明函数的方式

void MAX_Interface::Buf_IO(HAL_StatusTypeDef IO)
{
    HAL_StatusTypeDef (FuncPtr*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t) = IO;
    uint8_t* buf_ptr = (uint8_t*) &OBuf;

    HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_RESET);
    FuncPtr(h_SPI, buf_ptr, 3, 100);
    HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_SET);
}

我知道我可能把它过于复杂了,因为我之前只写了两个不同的函数来传输接收,但我希望让我的代码更简洁,并在此过程中学到一些东西,所以请随意如果您能想到一个更优雅的解决方案,请提出一个更优雅的解决方案?

在 C++ 中,您应该使用 using 指令来定义函数签名。 using 与 C 中的 typedef 类似,但使内容更具可读性。

using IO = HAL_StatusTypeDef(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t);

注意,IO 现在是函数签名本身的别名,而不是指向函数的指针。

现在,在您的函数中,您将它用作 IO* 来指定参数是一个函数指针:

void MAX_Interface::Buf_IO(IO* funcPtr)
{
    uint8_t* buf_ptr = (uint8_t*) &OBuf;

    HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_RESET);
    funcPtr(h_SPI, buf_ptr, 3, 100);
    HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_SET);
}