【发布时间】:2018-08-09 22:24:54
【问题描述】:
我正在使用测试驱动开发方法用 C 语言编写传感器驱动程序。驱动程序将用于使用 STM32F415 ARM 处理器的项目中。项目是使用 CubeMX 软件生成的,该软件还为各种外围设备生成供应商特定的硬件抽象层文件。我将在我的传感器驱动程序中使用为 SPI 通信协议生成的文件 stm32f4xx_hal_spi.h 和相应的源文件。
我的目标是为 SPI 接口创建一个模拟,然后测试驱动我的传感器驱动程序。我还想尽可能从我的驱动程序代码中抽象出 SPI HAL。原因是相同的驱动程序还必须支持 I2C 协议,因此理想情况下它们可以轻松交换。这也是我想避免将 SPI HAL 文件直接复制到我的传感器驱动程序中的原因。
我最初的方法是创建一个单独的头文件spi_interface.h 并使用它来重新声明我需要来自stm32f4xx_hal_spi.h 的函数。然后我会从这个头文件生成一个模拟。这将允许我测试驱动程序接口的其余部分。
但是,SPI HAL 函数比我最初想象的要复杂。这是一个例子:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
我的问题与 SPI HAL 函数用作参数的 SPI_HandleTypeDef 结构有关:
typedef struct __SPI_HandleTypeDef
{
SPI_TypeDef *Instance; /* SPI registers base address */
SPI_InitTypeDef Init; /* SPI communication parameters */
uint8_t *pTxBuffPtr; /* Pointer to SPI Tx transfer Buffer */
uint16_t TxXferSize; /* SPI Tx Transfer size */
__IO uint16_t TxXferCount; /* SPI Tx Transfer Counter */
uint8_t *pRxBuffPtr; /* Pointer to SPI Rx transfer Buffer */
uint16_t RxXferSize; /* SPI Rx Transfer size */
__IO uint16_t RxXferCount; /* SPI Rx Transfer Counter */
void (*RxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Rx ISR */
void (*TxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Tx ISR */
DMA_HandleTypeDef *hdmatx; /* SPI Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* SPI Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_SPI_StateTypeDef State; /* SPI communication state */
__IO uint32_t ErrorCode; /* SPI Error code */
}SPI_HandleTypeDef;
它由多个其他结构组成,这让我认真思考这里的正确方法。在模拟供应商 HAL 接口时,是否有一种完善的处理结构的方法?我是否将所有需要的struct 定义复制到我的spi_interface.h?我的初始计划在这种情况下有效吗?
【问题讨论】:
-
Bloatware HAL 来编写另一个不必要的抽象级别。 IMO 的想法 100% 错误。 uC 编程需要完全不同的方法。如果你想在硬件(寄存器)级别编写自己的抽象层程序 uC
标签: c unit-testing tdd