历史上的今天
返回首页

历史上的今天

今天是:2024年11月23日(星期六)

2019年11月23日 | STM32中assert_param的分析(转)

2019-11-23 来源:eefocus

我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。


断言机制函数assert_param


我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型


#defineIS_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, u32line) 

    /* User can add his ownimplementation to report the file name and line number, 

       ex: printf("Wrong parametersvalue: file %s on line %drn", 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 belowif you will not use the peripherals drivers.

In this case, these drivers willnot be included and the application code will 

be based on direct access toperipherals registers 

*/

#define USE_STDPERIPH_DRIVER

#endif

 

#ifdef USE_STDPERIPH_DRIVER

#include "stm32f10x_conf.h"

#endif


可以很容易看出来,我们不在那里添加,这个头文件中也给我们设置了开关,只要把第一个的注释去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,在第二个文件中我们可以知道怎样包含这个控制开关文件了,呵呵。我们也明白为什么我们在写程序的时候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,我们只要在stm32f10x_conf.h配置一下就能包含所需要的库文件了。


通过以上可以看出,通过头文件的相互包含,来控制外设以及调试文件的调用,这样我们理清思路,理解起来就好多了。当然在学习中可能有些C语言问题还没有理解透彻,多上网搜一下,或者多看书,很快就搞明白的。

 


推荐阅读

史海拾趣

台湾唯圣(GW)公司的发展小趣事
为用户提供详细的使用指南和安全注意事项,确保用户能够正确、安全地使用该设备。
Fong Ya Enterprise Co Ltd公司的发展小趣事
负责接收外部指令,并根据预设的程序控制电流源的工作状态。
Aristo-Craft/ L M P Inc公司的发展小趣事

品质是公司的生命线。Aristo-Craft/L M P Inc一直注重品质管理,从原材料采购到生产过程的每一个环节都进行严格把控。公司建立了完善的质量管理体系,并通过了多项国际质量认证。同时,公司还注重品牌建设,通过广告宣传、参加行业活动等方式提高品牌知名度和美誉度。

北京人民电器厂公司的发展小趣事

为了提高生产效率和产品质量,北京人民电器投入大量资金建设了自动化装配检测流水线。这一举措使得公司的生产能力得到了大幅提升,同时也确保了产品的一致性和可靠性。自动化流水线的建设,是北京人民电器在现代化生产道路上迈出的重要一步。

FTDI公司的发展小趣事

为了加强技术研发和创新能力,北京人民电器建立了北京市级技术研究中心,并吸引了教授级高工、博士后、博士、硕士等多层次的专业技术人才。这些人才为公司的新产品研发、技术创新提供了强大的智力支持,使得北京人民电器在激烈的市场竞争中始终保持领先地位。

Alpha Semiconductor公司的发展小趣事

Alpha Semiconductor公司于1983年创立,成立之初,公司主要从事代工服务业务。这一策略为Alpha Semiconductor在半导体行业打下了坚实的基础。通过为其他公司提供高质量的代工服务,Alpha Semiconductor逐渐积累了技术实力和行业经验,为后续的自主研发和产品创新奠定了坚实的基础。

问答坊 | AI 解惑

世界著名汽车品牌标识演化历史------三菱

三菱 Mitsubishi 三菱品牌的故事,要追溯到那还没有汽车的年代。1854年的日本,还处在封建时期,有个乡下农民的儿子叫做Yataro Iwasaki,以前他的家族也是高高在上的封建武士阶层,但是为了还债,他的祖父出卖了家族的武士地位。这在那样的年 ...…

查看全部问答>

2007年全国大赛本科组的全部题目!!!!!!!

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 2007年全国大赛本科组的全部题目!!!!!!! 啥都不说了 分享之~~~~~~  …

查看全部问答>

[ERP]深圳嘉立盛公司专业定制ERP,OA,CRM,进销存

[ERP]深圳嘉立盛公司专业订制ERP,OA , CRM,进销存,1000元起订      深圳嘉立盛是一家专业从事软件开发订制,对ERP,OA,CRM,仓库进销存,客户管理系统,软件的订制有一流的经验,先后为多家中,小型公司提供过软件订制服务,先 ...…

查看全部问答>

关于config.bib内存配置问题?

在config.bib文件中: NK      80200000  00C00000  RAMIMAGE      ;for 48M appRAM   RAM     80E00000  03000000  RAM &n ...…

查看全部问答>

单片机(16F877A)串口传数据问题

我用pc往单片机串口写数据,1次只能写1个字节,然后停留20MS才能写下一个。如果速度过快(一次写多字节或不停的1个1个往里写)串口中断1次后就没用中断产生。波特率两边都是9600,异步模式,大家帮我想下是什么原因啊?…

查看全部问答>

寻求嵌入式开发项目经理-日语2级相当~有人推荐?赶紧联系我

项目经理1名 1、        大学本科以上学历,计算机相关专业; 2、        从事对日软件开发1年以上,了解对日开发行业特征; 3、        熟悉WIN CE操作系统;能熟练使用C或C++等 ...…

查看全部问答>

请教:数字示波器前级信号调理电路

就是AD前面的信号调理电路,希望做成自动增益控制,而且希望成本不是太高(网上搜了几个电路那芯片用的一个叫贵)……小弟水平不高,希望各位大虾指教,能提供原理图最好了,或者说个方向也行。谢谢大家!…

查看全部问答>

【为C2000做贡献】基于TMSF2812 DSP模板的USB2.0驱动程序的设计与实现

基于TMSF2812 DSP模板的USB2.0驱动程序的设计与实现 摘要:研究了基于TMSF2812 DSP (Digital Signal Processor) 模板的USB2.0在Windows2000环境下驱动程序的计方法及实现过程,着重介绍了USB 在DSP 模板上的固件程序的设计过程,给出了基于CY7 ...…

查看全部问答>

STM32

各位大虾 定时器的互补输出比较是什么意思啊…

查看全部问答>