你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
HAL函数对Handle有效性的检查为什么不是用assert_param断言?
[复制链接]
zoomdy
提问时间:2017-1-24 12:48 /
问答
是否解决:
本帖最后由 zoomdy 于 2017-1-24 12:54 编辑
HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
{
/* Check the SPI handle allocation */
if (hspi == NULL)
{
return HAL_ERROR;
}
/* Check the parameters */
assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
assert_param(IS_SPI_MODE(hspi->Init.Mode));
assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));
assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
assert_param(IS_SPI_NSS(hspi->Init.NSS));
assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));
......
}
复制代码
以HAL_SPI_Init为例,hspi参数的检查并没有使用assert_param断言宏,如果是我实现的话,我会用assert_param(hspi != NULL)实现。一般来讲,入参错误通常是bug,本着早死早超生的原则,用断言宏把它摁死更干脆。使用返回值的话,如果调用方没有检查返回值的话,会转移事故现场,增加排错的难度。不知道HAL中使用返回错误值的方式检测Handle参数有没有什么用意?或者说有什么好处?
赞
0
收藏
3
评论
19
分享
发布时间:2017-1-24 12:48
举报
请先
登录
后回复
19个回答
creep
回答时间:2017-2-8 08:29:13
a0a.1 32b0c
楼主需要明白的是断言(assert_param)一般只用在程序的调试阶段用于判断传入的部分系统参数是否正确,等程序发布的时候编译生成可执行文件时是会关闭断言的,因为断言可能在某种程度上影响程序的运行效率。但是此时对传入函数的参数是否为NULL 需要任何时候都要进行判断,所以不能用断言assert_param(hspi != NULL)进行判断了。
评分
参与人数
1
ST金币
+5
收起
理由
zero99
+ 5
支持二楼的解释
查看全部评分
赞
0
评论
回复
支持
反对
党国特派员
回答时间:2017-2-8 14:55:00
a0a.1 32b0c
本帖最后由 党国特派员 于 2017-2-8 15:21 编辑
我来说个直白点的
断言一般是内部函数对参数的有效性进行检查。也就是说你的这些参数不是用户给的,能够保证参数的正确性。
如果你的函数是给用户使用的,那么就要使用IF ELSE对参数进行检查。因为用户很有可能给你传过来不是你要求的值。
至于3楼,没有说到断言的真正意图,会对大家造成一种误解,我实在不敢认同。
赞
0
评论
回复
支持
反对
七哥
回答时间:2017-2-8 11:42:41
a0a.1 32b0c
根据二楼所说,及平时用Keil的应用。
对断言这么理解,assert_param(hspi != NULL) 只在调试仿真过程中才会有效;
而程序在编译成可执行代码后,这句相当于不存在了。而为了代码安装需要时时刻刻来判断输入参数是否有效,一旦输入参数无效,却被错误的执行了,那后果可能是灾难性的。
赞
0
评论
回复
支持
反对
creep
回答时间:2017-2-8 07:55:42
a8a.1 32b0c
本帖最后由 creep 于 2017-2-8 08:55 编辑
先抢个沙发
,楼下再细说。
赞
0
评论
回复
支持
反对
无薪税绵
回答时间:2017-2-8 08:40:41
a0a.1 32b0c
支持二楼的解释。
赞
0
评论
回复
支持
反对
庚
回答时间:2017-2-8 08:46:24
a1024a.1 32b0c
赞
0
评论
回复
支持
反对
队长shiwo
回答时间:2017-2-8 08:52:58
a0a.1 32b0c
不明白断言是什么意思
赞
0
评论
回复
支持
反对
yb0121
回答时间:2017-2-8 09:04:54
a1032a.1 32b0c
二楼真相
赞
0
评论
回复
支持
反对
诡异之云
回答时间:2017-2-8 09:33:29
a0a.1 32b0c
前来围观 不过学了一招
赞
0
评论
回复
支持
反对
斜阳
回答时间:2017-2-8 10:38:22
a0a.1 32b0c
支持2楼解释
赞
0
评论
回复
支持
反对
johnson_gong
回答时间:2017-2-8 11:12:22
a0a.1 32b0c
围观学习一下.......
赞
0
评论
回复
支持
反对
creep
回答时间:2017-2-8 11:47:18
a0a.1 32b0c
之前分享的一个使用断言关于参数检查的帖子:
【STM32F303开发】+库函数参数检查
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
赞
0
评论
回复
支持
反对
cldym
回答时间:2017-2-8 11:59:35
a0a.1 32b0c
支持二楼的解释。
赞
0
评论
回复
支持
反对
zbber
回答时间:2017-2-8 13:25:36
a0a.1 32b0c
淡定,淡定,淡定……
赞
0
评论
回复
支持
反对
1
2
/ 2 页
下一页
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
我来说个直白点的
断言一般是内部函数对参数的有效性进行检查。也就是说你的这些参数不是用户给的,能够保证参数的正确性。
如果你的函数是给用户使用的,那么就要使用IF ELSE对参数进行检查。因为用户很有可能给你传过来不是你要求的值。至于3楼,没有说到断言的真正意图,会对大家造成一种误解,我实在不敢认同。
对断言这么理解,assert_param(hspi != NULL) 只在调试仿真过程中才会有效;
而程序在编译成可执行代码后,这句相当于不存在了。而为了代码安装需要时时刻刻来判断输入参数是否有效,一旦输入参数无效,却被错误的执行了,那后果可能是灾难性的。
先抢个沙发
【STM32F303开发】+库函数参数检查
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)