你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
我来说个直白点的
断言一般是内部函数对参数的有效性进行检查。也就是说你的这些参数不是用户给的,能够保证参数的正确性。
如果你的函数是给用户使用的,那么就要使用IF ELSE对参数进行检查。因为用户很有可能给你传过来不是你要求的值。至于3楼,没有说到断言的真正意图,会对大家造成一种误解,我实在不敢认同。
对断言这么理解,assert_param(hspi != NULL) 只在调试仿真过程中才会有效;
而程序在编译成可执行代码后,这句相当于不存在了。而为了代码安装需要时时刻刻来判断输入参数是否有效,一旦输入参数无效,却被错误的执行了,那后果可能是灾难性的。
先抢个沙发,楼下再细说。
【STM32F303开发】+库函数参数检查
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)