函数指针,在 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);
}
我遇到了一个非常令人困惑的错误,因为我可能在措辞或类型句柄上犯了一个小错误,或者这可能是一个更复杂的问题
基本上我想创建这个函数 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);
}