c - 使用 ARM 供应商 HAL 进行测试驱动开发

标签 c unit-testing tdd

我正在使用测试驱动开发方法用 C 语言编写传感器驱动程序。驱动程序将用于使用 STM32F415 ARM 处理器的项目。项目是使用 CubeMX 软件生成的,该软件还为各种外设生成供应商特定的硬件抽象层文件。我将在我的传感器驱动程序中使用为 SPI 通信协议(protocol)生成的文件 stm32f4xx_hal_spi.h 和相应的源文件。

我的目标是为 SPI 接口(interface)创建一个模拟,然后测试驱动我的传感器驱动程序。我还想尽可能从我的驱动程序代码中抽象 SPI HAL。原因是相同的驱动程序还必须支持 I2C 协议(protocol),因此理想情况下它们可以轻松交换。这也是我希望避免将 SPI HAL 文件直接复制到我的传感器驱动程序中的原因。

我最初的方法是创建一个单独的头文件 spi_interface.h 并使用它来重新声明 stm32f4xx_hal_spi.h 中我需要的函数。然后我会从这个头文件生成一个模拟。这将使我能够测试驱动程序接口(interface)的其余部分。

但是,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 接口(interface)时是否有一种完善的处理结构的方法?我是否将所有需要的 struct 定义复制到我的 spi_interface.h 中?在这种情况下我最初的计划是否有效?

最佳答案

在 Google 上搜索“SPI bit bash”或“SPI bit bang”,然后将其移植到 STM32。您真正应该做的唯一移植是交换要移植到 STM 的代码的 GPIO 层。因此,寻找能够抽象出这部分的代码,并让您可以轻松地交换这部分。我想你可以尝试this driver来自马克西姆。只需移植 spiReadReg ()spiWriteReg() 函数即可。

首先,您可以将 SPI_CS = 1; 之类的内容替换为 GPIO_SetBits(YOUR_SPI_PORT, YOUR_GPIO_CS_PIN); 之类的内容。

使用 SPI,无论您操作总线的速度有多慢都没有关系。您可以按照自己喜欢的速度慢慢地进行,然后逐渐加快速度,直到发现错误为止。

对于I2C,我已经成功移植this driver从 Microchip 移植到 STM32F,并使其与 TI 的基于 I2C 的电池平衡器/监视器配合使用。如果您正在使用的代码足够简单,那么它应该是一项简单且相对轻松的工作,即使不是很有趣。

关于c - 使用 ARM 供应商 HAL 进行测试驱动开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776544/

相关文章:

javascript - 如何在 Node.js 中模拟 elasticsearch 实例?

c - 必须使用 `%.4s` 的精度修饰符才能显示 `char[4]` ,为什么简单的 `%s` 不能正常工作?

c - 下面在C中定义

c - 如何在Windows 10中正确使用inet_pton rotine?

unit-testing - 使用 std 测试包对每个测试进行设置和拆卸

ruby - RSpec 自定义匹配器保持规范之间的状态

c# - 在这种情况下编写好的单元测试

c - 如何将 volatile 变量传递给 c 中的函数?

java - 使用 mockito 对构造函数进行单元测试

reactjs - 使用 react 测试库和 Jasmine