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

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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版