STM32
直播中

万航渡路

8年用户 1331经验值
擅长:电源/新能源
私信 关注
[问答]

请问HAL函数对Handle有效性的检查为什么不是用assert_param断言?



  • HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
  • {
  •   /* Check the SPI handle allocation */
  •   if (hspi == NULL)
  •   {
  •     return HAL_ERROR;
  •   }

  •   /* Check the parameters */
  •   assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
  •   assert_param(IS_SPI_MODE(hspi->Init.Mode));
  •   assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));
  •   assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
  •   assert_param(IS_SPI_NSS(hspi->Init.NSS));
  •   assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));
  • ......
  • }

以HAL_SPI_Init为例,hspi参数的检查并没有使用assert_param断言宏,如果是我实现的话,我会用assert_param(hspi != NULL)实现。一般来讲,入参错误通常是bug,本着早死早超生的原则,用断言宏把它摁死更干脆。使用返回值的话,如果调用方没有检查返回值的话,会转移事故现场,增加排错的难度。不知道HAL中使用返回错误值的方式检测Handle参数有没有什么用意?或者说有什么好处?

回帖(1)

663593

2024-5-8 17:20:33
在HAL_SPI_Init函数中,对Handle有效性的检查使用的是if语句,而不是assert_param断言。这是因为在这种情况下,使用if语句更合适。以下是原因:

1. 错误处理:当hspi为NULL时,函数返回HAL_ERROR,这是一个明确的错误处理方式。如果使用assert_param断言,当条件不满足时,程序将调用assert_failed函数,这可能导致程序崩溃或者进入无限循环,而不是返回一个错误状态。

2. 可读性:使用if语句可以提高代码的可读性。当阅读代码时,开发者可以清楚地看到Handle有效性的检查,而不需要查看assert_param的定义和行为。

3. 灵活性:if语句提供了更多的灵活性,可以根据需要添加更多的错误处理逻辑。而assert_param断言通常用于检查参数的有效性,一旦条件不满足,程序将立即终止。

4. 编译选项:assert_param断言可以在编译时通过定义NDEBUG宏来禁用。这意味着在某些情况下,assert_param断言可能不会执行,从而降低了代码的健壮性。而if语句不会受到这种影响。

综上所述,使用if语句对Handle有效性进行检查是更合适的选择。当然,assert_param断言在检查参数有效性方面仍然非常有用,例如在HAL_SPI_Init函数中检查SPI模式、方向等参数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分