单片机开发工具篇:(八)assert_param() 函数的作用
·
| 上一篇 | |
|---|---|
| Keil MDK 如何更改已有工程的工程名 |
assert_param() 函数的作用
在 STM32 HAL 库开发中,assert_param() 函数的作用是 参数检查与调试辅助。
1)功能详述:
它用于在运行时验证传递给 HAL 库函数的参数是否合法(例如,检查指针是否为空、枚举值是否在有效范围内)。如果参数无效,assert_param() 会触发断言失败,通常会跳转到 assert_failed() 函数或 Error_Handler() 函数,便于开发者快速定位和修复错误,提高代码的健壮性和调试效率。该功能在调试阶段非常有用,发布版本中可选择禁用以节省空间。
2)代码定义:
assert_param() 的行为是可配置的。它通常在类似于 stm32f1xx_hal_conf.h 或 stm32f1xx.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 传入错误了,就会触发断言失败处理函数;
函数体中第三行,如果 pData 为 NULL ,就会触发断言失败处理函数。
更多推荐
所有评论(0)