您的位置 首页 电子

STM32 中的 assert_param 函数

我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一…

咱们在学STM32的时分函数assert_param呈现的几率非常大,上网查找一下,网上一般解说断语机制,做为程序开发调试阶段时运用。下面我就谈一下我对这些运用的观点,学习东西抱着知其然也要知其所以然。

4 断语机制函数assert_param
咱们在剖析库函数的时分,简直每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的了解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),咱们能够寻找到原型
#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_BASE)|| \
((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) || \
((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) || \
((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) || \
((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) || \
((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) || \
((*(uint32_t*)&(PERIPH)) == GPIOG_BASE))
这个宏界说的效果便是查看参数PERIPH,判别参数PERIPH是否为GPIOX(A…G)基址中的一个,只需有一个为真则其值为真,否则为假,不用多说,这是C言语中根本的逻辑运算。当然这个库函数也用的很有意思,看:首要对PERIPH进行取址,也便是求地址,&PERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t *),然后经过*进行拜访这个地址(指针)中的内容。不多说了,看几遍就能了解。
下面咱们再回到assert_param这个函数,这个函数是哪里的呢?在stm32f10x_conf.h寻找到原型如下:
#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t*)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
这是一个预编译文件,若是界说了USE_FULL_ASSERT这个文件,则碑文后边的文件,咱们在程序中一般都没什么界说,即碑文后边这个查办((void)0),这个查办不用多想,没有界说USE_FULL_ASSERT便是什么也不碑文。说的了解点,对上面的那个查办IS_GPIO_ALL_PERIPH(GPIOx)不碑文任何操作。
若是界说了USE_FULL_ASSERT它,咱们调用这个函数assert_param时,及对参数IS_GPIO_ALL_PERIPH(GPIOx)的正确性进行查看,经过一个C言语中的双目运算符来判别,若是回来1,碑文查办(void)0,跟上面相同,若是回来0,则碑文后边的函数assert_failed((uint8_t *)__FILE__,__LINE__),函数的效果在库函数中有解说,用来指示犯错的行数和文件。留意:__FILE__,__LINE__是规范库函数中的宏界说!沙里淘金
void assert_failed(uint8_t* file, uint32_t line);刚开始没看了解为什么加在这儿,细心一想是在头文件的函数声明。至于函数实体呢?咱们从官方文件的模板中main.c中能够找到。如下:
void assert_failed(u8* file, u32 line)
{ /* User can add his own implementation to report the file name and linenumber,
ex: printf(“Wrong parameters value: file %s on line %d\r\n”, file,line) */
/* Infinite loop */
while (1) { }
} 英文注释也阐明晰怎样运用,经过输入参数来确认方位,最简略的办法便是串口打印了,这个函数的首要思维是在输入参数有问题的时分,可是有编译不出来,它能够帮你查看参数的有用性,优点不用多言,自己领会就行。
持续阐明如下: assert_param是怎样包括进去的呢?咱们在stm32f10x_conf.h这个头文件中界说的函数声明仍是宏界说,怎样在其它文件中都能运用呢?也许多网上朋友在刚开始学习的时分都遇到编译不过去的问题呈现,终究经过在文件中增加USE_STDPERIPH_DRIVER来处理的:

咱们能够在整个工程中进行查找USE_STDPERIPH_DRIVER,经过头文件能够看出,是运用规范外设文件。在stm32f10x.h文件中咱们能够查找到如下状况:
#if !defined USE_STDPERIPH_DRIVER
/
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will
be based on direct access to peripherals registers
*/
#define USE_STDPERIPH_DRIVER
#endif

#ifdef USE_STDPERIPH_DRIVER
#include “stm32f10x_conf.h”
#endif
能够很简单看出来,咱们不在那里增加,这个头文件中也给咱们设置了开关,只需把第一个的注释去掉,就不用在装备中增加USE_STDPERIPH_DRIVER了,在第二个文件中咱们能够知道怎样包括这个操控开关文件了,。咱们也了解为什么咱们在写程序的时分只需包括stm32f10x.h就能很简单的包括一切的文件文件了吧,咱们只需在stm32f10x_conf.h装备一下就能包括所需求的库文件了。
经过以上能够看出,经过头文件的彼此包括,来操控外设以及调试文件的调用,这样咱们理清思路,了解起来就好多了。当然在学习中或许有些C言语问题还没有了解透彻,多上网搜一下,或许多看书,很快就搞了解的。

PS 2:

STM32中assert_param的运用

在STM32的固件库和供给的例程中,处处都能够见到assert_param()的运用。假如翻开任何一个例程中的stm32f10x_conf.h文件,就能够看到实际上assert_param是一个宏界说;
在固件库中,它的效果便是检测传递给函数的参数是否是有用的参数。
所谓有用的参数是指分量规则规模的参数,比方某个参数的取值规模只能是小于3的正整数,假如给出的参数大于3,
则这个assert_param()能够在运转的程序调用到这个函数时陈述过错,使程序员能够及时发现过错,而不用比及程序运转成果的过错而大费周折。

这是一种常见的软件技术,能够在调试阶段协助程序员快速地扫除那些显着的过错。

它确真实程序的运转上献身了功率(但只是在调试阶段),但在项目的开发上却协助你提高了功率。

当你的项目开发成功,运用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));
。。。

在碑文assert_param()的查验时,假如发现参数犯错,它会调用函数assert_failed()向程序员陈述过错,在任何一个例程中的main.c中都有这个函数的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{

while (1)
{}
}

你能够依照自己运用的环境需求,增加恰当的查办输犯过错的信息提示,或修正这个函数做出恰当的过错处理。

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预界说对应

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/264849.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部