你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
zoomdy 提问时间:2017-1-24 12:48 /
本帖最后由 zoomdy 于 2017-1-24 12:54 编辑
  1. HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
  2. {
  3.   /* Check the SPI handle allocation */
  4.   if (hspi == NULL)
  5.   {
  6.     return HAL_ERROR;
  7.   }

  8.   /* Check the parameters */
  9.   assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
  10.   assert_param(IS_SPI_MODE(hspi->Init.Mode));
  11.   assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));
  12.   assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
  13.   assert_param(IS_SPI_NSS(hspi->Init.NSS));
  14.   assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));
  15. ......
  16. }
复制代码
以HAL_SPI_Init为例,hspi参数的检查并没有使用assert_param断言宏,如果是我实现的话,我会用assert_param(hspi != NULL)实现。一般来讲,入参错误通常是bug,本着早死早超生的原则,用断言宏把它摁死更干脆。使用返回值的话,如果调用方没有检查返回值的话,会转移事故现场,增加排错的难度。不知道HAL中使用返回错误值的方式检测Handle参数有没有什么用意?或者说有什么好处?

收藏 3 评论19 发布时间:2017-1-24 12:48

举报

19个回答
creep 回答时间:2017-2-8 07:55:42
本帖最后由 creep 于 2017-2-8 08:55 编辑

先抢个沙发,楼下再细说。
creep 回答时间:2017-2-8 08:29:13
楼主需要明白的是断言(assert_param)一般只用在程序的调试阶段用于判断传入的部分系统参数是否正确,等程序发布的时候编译生成可执行文件时是会关闭断言的,因为断言可能在某种程度上影响程序的运行效率。但是此时对传入函数的参数是否为NULL 需要任何时候都要进行判断,所以不能用断言assert_param(hspi != NULL)进行判断了。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5 支持二楼的解释

查看全部评分

无薪税绵 回答时间:2017-2-8 08:40:41
支持二楼的解释。
回答时间:2017-2-8 08:46:24
队长shiwo 回答时间:2017-2-8 08:52:58
不明白断言是什么意思
boboo-23776 回答时间:2017-2-8 09:04:54
二楼真相
诡异之云 回答时间:2017-2-8 09:33:29
前来围观 不过学了一招
斜阳__ 回答时间:2017-2-8 10:38:22
支持2楼解释
johnson_gong 回答时间:2017-2-8 11:12:22
围观学习一下.......
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版