assert_param的应用

原创 2015年11月19日 10:15:53

在STM32的固件库,到处都可以见到assert_param()的使用。一开始见到这玩意就被打蒙了,不晓得它存在的价值,各种查询,理解综合如下。

如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于7的正整数,如果给出的参数大于7,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。

        这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。
        它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
        当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
库函数stm32f0xx_conf.h中有如下一段,以此为例:
#ifdef  USE_FULL_ASSERT
          #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)
#endif /* USE_FULL_ASSERT */

        如果定义了USE_FULL_ASSERT,就把 assert_param(expr) 定义为((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 并申明一下assert_failed这个函数。否则把assert_param(expr)定义为空。 __FILE__和__LINE__是IAR定义的宏,指的是当前的编译的文件名和行数。 整个宏作用为:如果expr为真,则什么也不返回,如果expr为假,则调用assert_failed()这个出错程序。

举例:#define IS_GPIO_MODE(MODE)     (((MODE) == GPIO_Mode_IN) || ((MODE) ==GPIO_Mode_OUT) ||  ((MODE) == )
                                                          || ((MODE) == GPIO_Mode_AN))


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
            /* Check the parameters */
          assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
}


GPIO_InitStruct->GPIO_Mode是枚举类型,只能是GPIO_Mode_IN、GPIO_Mode_OUT、GPIO_Mode_AF、GPIO_Mode_AN中一个,因此宏定义IS_GPIO_MODE(MODE)能判断是其中一个为真,否则为假。因此达到调试的目的。
assert_failed()函数完成的具体操作,由用户自己定义。


版权声明:本文为博主原创文章,未经博主允许不得转载。

STM32中assert_param的使用

  • 2015年06月26日 16:28
  • 64KB
  • 下载

assert_param-转载.txt

  • 2011年12月12日 20:15
  • 2KB
  • 下载

STM32的断言机制——函数assert_param()

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

STM32中assert_param的使用

在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义...

STM32 中的 assert_param 函数

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

#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行什么操作

问题:#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行什么操作 具体的定义和用法在下面 void MY_NVIC_SetVe...

单片机之STM32 中的 assert_param 函数

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

assert_param函数的意义

 在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定...

STM32中assert_param的使用(转)

在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义...

关于STM32程序中的assert_param

我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:assert_param的应用
举报原因:
原因补充:

(最多只允许输入30个字)