上一篇
Keil MDK 如何更改已有工程的工程名

assert_param() 函数的作用

在 STM32 HAL 库开发中,assert_param() 函数的作用是 参数检查与调试辅助

1)功能详述:

它用于在运行时验证传递给 HAL 库函数的参数是否合法(例如,检查指针是否为空、枚举值是否在有效范围内)。如果参数无效assert_param() 会触发断言失败,通常会跳转到 assert_failed() 函数或 Error_Handler() 函数,便于开发者快速定位和修复错误,提高代码的健壮性和调试效率。该功能在调试阶段非常有用,发布版本中可选择禁用以节省空间。

2)代码定义:

assert_param() 的行为是可配置的。它通常在类似于 stm32f1xx_hal_conf.hstm32f1xx.h 的头文件中被定义为一个宏,并通过 USE_FULL_ASSERT 这个宏来控制:

  • 定义了 USE_FULL_ASSERT:断言功能开启,会进行参数检查。
  • 未定义 USE_FULL_ASSERT:断言功能关闭assert_param() 被定义为空操作(即不执行任何代码),不影响最终程序的运行效率和大小。
ifdef  USE_FULL_ASSERT
	#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
	void assert_failed(uint8_t* file, uint32_t line);
#else
	#define assert_param(expr) ((void)0U)
#endif 

其中的断言失败处理函数 assert_failed() 需要定义在 main.c 文件(或用户自定义文件)中。

3)示例:

HAL_UART_Transmit() 函数中,就有诸多的断言检查(假设 USE_FULL_ASSERT 被定义):

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  // 参数检查
  assert_param(IS_UART_INSTANCE(huart->Instance));
  assert_param(IS_UART_TRANSMIT_INSTANCE(huart->Instance));
  assert_param(pData != NULL); // 检查 pData 是否为空
  assert_param(Size > 0);
  // ...
}

函数体中第一行,如果结构体指针 huart 中的参数 Instance 传入错误了,就会触发断言失败处理函数;

函数体中第三行,如果 pDataNULL ,就会触发断言失败处理函数。


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐