历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2018年12月11日 | STM32中的assert_param函数浅析

2018-12-11 来源:eefocus

下面我将对它的作用及其用法进行简单的总结!


其实assert_param()是一个断言机制函数,它主要是用于调试代码。


比如我们在调用void USART_DMACmd()库函数时,追踪一下它的定义,会发现它是定义在stm32f10x_usart.c文件中再来看看它是如何定义的:


void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_USART_DMAREQ(USART_DMAReq));  

  assert_param(IS_FUNCTIONAL_STATE(NewState)); 

  if (NewState != DISABLE)

  {

    /* Enable the DMA transfer for selected requests by setting the DMAT and/or

       DMAR bits in the USART CR3 register */

    USARTx->CR3 |= USART_DMAReq;

  }

  else

  {

    /* Disable the DMA transfer for selected requests by clearing the DMAT and/or

       DMAR bits in the USART CR3 register */

    USARTx->CR3 &= (uint16_t)~USART_DMAReq;

  }

}


assert_param()函数在这里的作用是检查USART_DMACmd库函数传入的参数是否为真,如果为真,就什么也不执行,如果为假,就会在源程序编译的时候报错!


我们再追踪一下assert_param函数,发现它是在stm32f10x_conf.h中定义的,其本质是一个宏。


#ifdef  USE_FULL_ASSERT

 

/**

  * @brief  The assert_param macro is used for function's parameters check.

  * @param  expr: If expr is false, it calls assert_failed function which reports 

  *         the name of the source file and the source line number of the call 

  *         that failed. If expr is true, it returns no value.

  * @retval None

  */

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

/* Exported functions ------------------------------------------------------- */

  void assert_failed(uint8_t* file, uint32_t line);

#else

  #define assert_param(expr) ((void)0)


其实这个宏就是将一个条件判断语句((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))定义为assert_param(expr),英文也有注释,我就不多说了。


这位网友分析的还不错可以参考一下:点击打开链接


下面自己来举个例子实验一下:


 1 /*********************************************************************************

  2  *      Copyright:  (C) 2017 zoulei

  3  *                  All rights reserved.

  4  *

  5  *       Filename:  gg.c

  6  *    Description:  This file i

  7  *

  8  *        Version:  1.0.0(2017年07月13日)

  9  *         Author:  zoulei

 10  *      ChangeLog:  1, Release initial version on "2017年07月13日 15时42分36秒"

 11  *

 12  ********************************************************************************/

 13 #include

 14 //#define NDEBUG

 15 #include

 16 #include

 17

 18 int main( void )

 19 {

 20        FILE *fp;

 21

 22       /*   fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件

 23        assert( fp );                           //所以这里不会出错

 24        fclose( fp );*/

 25

 26        fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败

 27        assert( fp );                       //这里会出错

 28        fclose( fp );                          //程序永远都执行不到这里来

 29        return 0;

[zoulei@CentOS test]$ sudo vim gg.c

[zoulei@CentOS test]$ gcc gg.c

[zoulei@CentOS test]$ ./a.out

a.out: gg.c:27: main: Assertion `fp' failed.

已放弃 (core dumped)

[zoulei@CentOS test]$


上面编译测试我是在linux系统进行的,你会发现加上assert()函数之后,确实定位到具体的某一行以及文件,可能你会怀疑,那么我们再加上#define NDEBUG这段代码,这段代码它会禁用assert(fp)函数,我们再来看看效果。


[zoulei@CentOS test]$ sudo vim gg.c

[zoulei@CentOS test]$ gcc gg.c

[zoulei@CentOS test]$ ./a.out

段错误 (core dumped)

[zoulei@CentOS test]$


看!是不是没有出现错误是在哪个文件的哪一行的提示!这就验证了assert()的作用是检测函数传入参数是否为真!如果是大工程,这就为调式代码提高了效率。

推荐阅读

史海拾趣

Electronic Concepts Inc公司的发展小趣事

作为一家有社会责任感的企业,ECI始终关注环境保护和社会公益。公司积极参与各种环保活动,如节能减排、废物回收等。此外,ECI还设立了公益基金,资助贫困地区的教育事业和医疗事业。这些举措不仅提升了ECI的社会形象,也为公司赢得了更多客户的信任和支持。

高创科技(gotrend)公司的发展小趣事

作为一家有社会责任感的企业,ECI始终关注环境保护和社会公益。公司积极参与各种环保活动,如节能减排、废物回收等。此外,ECI还设立了公益基金,资助贫困地区的教育事业和医疗事业。这些举措不仅提升了ECI的社会形象,也为公司赢得了更多客户的信任和支持。

Gowanda Electronics公司的发展小趣事

进入21世纪后,ECI开始将目光投向国际市场。在海外市场部经理赵先生的努力下,ECI成功打入欧洲和北美市场。面对不同的文化背景和市场需求,ECI积极调整策略,提供符合当地需求的产品和服务。通过不懈努力,ECI在国际市场上的份额逐年增长,为公司的发展注入了新的动力。

佰鸿(BrtLed)公司的发展小趣事

随着业务规模的不断扩大,佰鸿意识到提升产能效率的重要性。于是,公司在1990年转投资中国大陆兴建东莞高步厂,现有土地面积和厂房面积均达到相当规模,员工数量也增至数千人。这一举措极大地提升了佰鸿的生产能力,使其能够更好地满足市场需求,同时也为公司后续的发展提供了有力的支持。

芯旺微电子(ChipON)公司的发展小趣事

在汽车电子领域,AEC-Q100品质认证是衡量MCU产品质量的重要标准。芯旺微电子通过不懈的努力和技术创新,成功研发出满足AEC-Q100品质认证的MCU产品,并广泛应用于汽车前装市场。这一突破不仅证明了芯旺微电子的技术实力,也为其赢得了国内外众多知名汽车厂商的信赖和合作。

帝特(DTECH)公司的发展小趣事

广州帝特电子科技有限公司成立于2000年4月,公司创始团队凭借对市场趋势的敏锐洞察和坚定信心,决定将主营业务定位于电脑外设产品的研发和生产。在创立初期,帝特就注重产品质量和技术创新,通过不断的技术研发和产品优化,逐渐在电脑外设领域崭露头角。

问答坊 | AI 解惑

简化传感器控制设计

赛普拉斯公司的CY8C21×34可编程系统级芯片(PSoC)混合信号阵列具有一个I/O模拟多路复用器,由于每个引脚都可以被用作一个模拟输入,因此采用单个SoC便能够轻松实现需要大量不同类型传感器的控制应用。本文介绍了在多种传感器控制应用中如何利用该器 ...…

查看全部问答>

09电子大赛-D题群33530708

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 09电子大赛-D题群33530708  …

查看全部问答>

大家好!!请教VHDL高手1个问题!!!

大家好!!请教VHDL高手1个问题!!! 问题主要出在如下语句上: --#20100403#问题:不知怎么回事?若下面三语句不屏蔽,则ADclk信号不正确,为乱码;而下面3语句屏蔽后,ADclk信号就没有问题了,但就无法分频了??? if Cs=\'0\' AND RD=\'1\' AND ...…

查看全部问答>

周立功NXP_LPC21xx22xx_系列ARM_芯片的启动程序分解

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 周立功NXP_LPC21xx22xx_系列ARM_芯片的启动程序分解,要好好学习一下哦……  …

查看全部问答>

2430单片机应用程序死掉

     在CC2430应用程序中没有进行对引脚的操作指令,但程序进行了长时间的运行后出现某I/O引脚被改变。请教各位大虾。还有对2430的flash操作过度频繁会不会导致应用程序死掉呢?flash中的数据会不会由于操作flash的过度频繁而 ...…

查看全部问答>

100分 入门互动

我是学计算机专业本科毕业,现在在电子公司工作,但不是从事设计,现在想向电子设计方面发展,请大家给我建议一个学习方案,我不知道从哪里开始学习。共同讨论,共同进步,更高更强,想奥运健儿学习,谢谢.......。…

查看全部问答>

有谁收到过2009嵌入式课件大赛的通知阿

各位大虾,小弟初来此地,从事嵌入式嵌入式教学; 最近收到个2009嵌入式课件大赛的通知,请问有哪位大虾参加过吗,效果怎么样?看上去奖金还行   http://contest.cessa.org 不知道可不可以在这个版发,好像没找到合适的版面,请斑竹 ...…

查看全部问答>

急!! 今天买了个IDE转USB的接口,安装的时候怎么也装不上去

急!! 今天买了个IDE转USB的接口,安装的时候怎么也装不上去,驱动光盘中是ALL IN ONE CARDREADER AU6368 和USB TO IDE GL811,是不是硬盘还要跳线什么的?请各专家看看是怎么回事?谢谢了焦急等待中^^^^^^…

查看全部问答>

C#2005写的文件读写怎么在wince5.0中不能打开和创建文件呢?

我只要读写.TXT 的文件就可以了。 会写的告诉我下可以吗? 谢谢拉…

查看全部问答>

愧疚的对做小车 无线通信的说:题目还没盖棺论定

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 …

查看全部问答>