这段文字借鉴了Hans.Cai的原文(https://www.cnblogs.com/caihongsheng/p/3514523.html):
程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。
assert(断言)的作用:
①首先,断言assert 是仅在Debug 版本起作用的宏,
②用于检查“不应该”发生的情况。在运行过程中,如果assert 的参数为假,那么程序就会中止(一般还会出现提示对话,说明在什么地方引发了assert)。
用法说明:
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:
1 #ifdef USE_FULL_ASSERT 2 /** 3 * @brief Reports the name of the source file and the source line number 4 * where the assert_param error has occurred. 5 * @param file: pointer to the source file name 6 * @param line: assert_param error line source number 7 * @retval None 8 */ 9 void assert_failed(uint8_t *file, uint32_t line) 10 { 11 /* USER CODE BEGIN */ 12 /* User can add his own implementation to report the file name and line number, 13 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 14 /* USER CODE END */ 15 } 16 #endif /* USE_FULL_ASSERT */
用户可以按照自己使用的环境需求,添加语句输出错误的信息提示,或修改这个函数做出错误处理。