打印

[转]STM32中assert_param的使用

[复制链接]
770|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黑夜的风|  楼主 | 2015-8-30 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;
在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,
则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。

相关帖子

沙发
黑夜的风|  楼主 | 2015-8-30 10:27 | 只看该作者
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。

它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。

当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
。。。

assert_param(IS_ADC_ALL_PERIPH(ADCx));
。。。

使用特权

评论回复
板凳
黑夜的风|  楼主 | 2015-8-30 10:27 | 只看该作者
在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{


while (1)
{}
}

你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。

使用特权

评论回复
地板
黑夜的风|  楼主 | 2015-8-30 10:28 | 只看该作者
1、STM32F10xD.LIB是DEBUG模式的库库文件。
2、STM32F10xR.LIB是Release模式的库库文件。
3、要选择DEBUG和RELEASE模式,需要修改stm32f10x_conf.h的内容。
    #define DEBUG 表示DEBUG模式,把该语句注释掉,则为RELEASE模式。
4、要选择DEBUG和RELEASE模式,也可以在Options,C/C++,Define里填入DEBUG的预定义。
    这样,就不需要修改stm32f10x_conf.h的内容。
5、如果把库加入项目,则不需要将ST的库源文件加入项目,比较方便。
    但是,库的选择要和DEBUG预定义对应。

使用特权

评论回复
5
会飞的大白| | 2015-8-31 09:00 | 只看该作者
黑夜的风 发表于 2015-8-30 10:28
1、STM32F10xD.LIB是DEBUG模式的库库文件。
2、STM32F10xR.LIB是Release模式的库库文件。
3、要选择DEBUG和 ...

这个有用,从来没考虑到这个东西

使用特权

评论回复
6
葫芦娃75| | 2015-8-31 13:05 | 只看该作者
学习了,一直不关注底层的库代码,也该学习下了!

使用特权

评论回复
7
eggbiscuit| | 2015-8-31 21:25 | 只看该作者
学习了,正看到这个东西呢,原来是这么回事

使用特权

评论回复
8
几时再见| | 2015-8-31 22:14 | 只看该作者
原来可以通过Release模式把这个去掉的,学习了!

使用特权

评论回复
9
谢谢楼主分享000000000000

使用特权

评论回复
10
学习了,很好000

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

78

帖子

0

粉丝