stm32中的 assert_param 函数

stm32中的 assert_param 函数

ID:1658198

大小:62.92 KB

页数:5页

时间:2017-11-12

stm32中的 assert_param 函数_第1页
stm32中的 assert_param 函数_第2页
stm32中的 assert_param 函数_第3页
stm32中的 assert_param 函数_第4页
stm32中的 assert_param 函数_第5页
资源描述:

《stm32中的 assert_param 函数》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。4断言机制函数assert_param我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型#de

2、fineIS_GPIO_ALL_PERIPH(PERIPH)(((*(uint32_t*)&(PERIPH))==GPIOA_BASE)

3、

4、((*(uint32_t*)&(PERIPH))==GPIOB_BASE)

5、

6、((*(uint32_t*)&(PERIPH))==GPIOC_BASE)

7、

8、((*(uint32_t*)&(PERIPH))==GPIOD_BASE)

9、

10、((*(uint32_t*)&(PERIPH))==GPIOE_BASE)

11、

12、((*(uint32_t*)&(PERIPH))==G

13、PIOF_BASE)

14、

15、((*(uint32_t*)&(PERIPH))==GPIOG_BASE))这个宏定义的作用就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A...G)基址中的一个,只要有一个为真则其值为真,否则为假,不用多说,这是C语言中基本的逻辑运算。当然这个库函数也用的很有意思,看:首先对PERIPH进行取址,也就是求地址,&PERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t*),然后通过*进行访问这个地址(指针)中的内容。不多说了,看几遍就能明白。下

16、面我们再回到assert_param这个函数,这个函数是哪里的呢?在stm32f10x_conf.h寻找到原型如下:#ifdefUSE_FULL_ASSERT#defineassert_param(expr)((expr)?(void)0:assert_failed((uint8_t*)__FILE__,__LINE__))voidassert_failed(uint8_t*file,uint32_tline);#else#defineassert_param(expr)((void)0)#endif这是一个预

17、编译文件,若是定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也不执行。说的明白点,对上面的那个语句IS_GPIO_ALL_PERIPH(GPIOx)不执行任何操作。若是定义了USE_FULL_ASSERT它,我们调用这个函数assert_param时,及对参数IS_GPIO_ALL_PERIPH(GPIOx)的正确性进行检查,通过一个C语言中的双目运算符来判断,若

18、是返回1,执行语句(void)0,跟上面一样,若是返回0,则执行后面的函数assert_failed((uint8_t*)__FILE__,__LINE__),函数的作用在库函数中有解释,用来指示出错的行数和文件。注意:__FILE__,__LINE__是标准库函数中的宏定义!切记voidassert_failed(uint8_t*file,uint32_tline);刚开始没看明白为什么加在这里,仔细一想是在头文件的函数声明。至于函数实体呢?我们从官方文件的模板中main.c中可以找到。如下:voidasse

19、rt_failed(u8*file,u32line){/*Usercanaddhisownimplementationtoreportthefilenameandlinenumber,ex:printf("Wrongparametersvalue:file%sonline%dr",file,line)*//*Infiniteloop*/while(1){}}英文注释也说明了怎么应用,通过输入参数来确定位置,最简单的方法就是串口打印了,这个函数的主要思想是在输入参数有问题的时候,但是有编译不出来,它可以帮你

20、检查参数的有效性,好处不必多言,自己领悟就行。继续说明如下:assert_param是怎样包含进去的呢?我们在stm32f10x_conf.h这个头文件中定义的函数声明还是宏定义,怎么在其它文件中都能应用呢?也很多网上朋友在刚开始学习的时候都遇到编译不过去的问题出现,最后通过在文件中添加USE_STDPERIPH_DRIVER来解决的:我们可以在整个工程中进行搜索USE_STDPERI

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。