必威体育Betway必威体育官网
当前位置:首页 > IT技术

20140626-STM8L101F3P6编程中关于assert_param()断言的小结

时间:2019-10-07 13:42:09来源:IT技术作者:seo实验室小编阅读:85次「手机版」
 

assert_param

在使用STM8或STM32的过程中,在官方的库文件中经常能看到assert_param()的使用,一直都是对它无视,因为它不影响使用。但作为一名合格的、严谨的工程师来讲,连assert_param()断言都没搞明白,都没弄清楚,自己感觉还是有点丢人的。

其实这个就是断言,它的主要用途是在编程的过程中为程序员提供参数检查,对于Release之后,对终端用户而言是无用的。它是在开发调试过程中,对参数错误进行提示,以便程序员提高开发效率。

首先,在STM8L101F3P6官方提供的模版库的main.c文件中我们会看到如下代码

void main(void)
{
    /* Infinite loop */
    while (1)
    {
    }

}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param ERROR has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

    /* Infinite loop */
    while (1)
    {
    }
}
#endif

其含义是:如果定义了USE_FULL_ASSERT宏,则程序包含了assert_failed()这个函数的定义。

在stm8l10x_conf.h文件中,我们也会看到如下的代码:

/* exported macro ------------------------------------------------------------*/
#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)
#endif /* USE_FULL_ASSERT */

这里是assert_param()的原型。

可以看到,它是一个带参数的宏定义,参数是一个条件表达式。表达式就是你要检查的参数。

表达式为真时,其定义为(void)0。即空,什么都不做,对程序无影响。函数调用时传来的参数都是正确的,不需要进行什么操作。

表达式为假时,其定义为assert_failed((uint8_t *)__FILE__,__LINE__)),这是一个带两个参数的函数,这个函数就是在main.c中定义的。第1个参数为文件指针,指示参数错误的文件;第2个参数是参数错误的等号。

--------------------------------------------------------------------------------------------------------------------------------------

1.使用时,要定义USE_FULL_ASSERT这个这宏,在stm8l10x_conf.h文件中去定义

2.可以是assert_failed()函数中,输出一些提示性的信息,来方便自己调试。

--------------------------------------------------------------------------------------------------------------------------------------

2014.06.25

于单位

相关阅读

怎样完美卸载IE8浏览器

准备工作要卸载IE8,首先要确认你的IE8和操作系统的版本。值得注意的是,删除Internet Explorer 8(IE8)时,会还原较早版本的Internet Exp

惠普802s墨盒怎么加墨、拆解、维护?

惠普802s墨盒怎么加墨、拆解、维护?这篇文章主要为大家介绍了惠普802s墨盒的相关知识,和802s墨盒会出哪些故障,该怎么办解决?下面分享

Topaz滤镜2018全系列合集Topaz Plugins Bundle

Topaz Plugins Bundle 2018 for Mac是一个Photoshop插件滤镜特效包,Topaz滤镜2018全系列插件包中包含Adjust、Detail、Lens Effect

ERROR:py4j.java_gateway:An error occurred while tr

在用pyspark做数据处理时,经常遇到这样的坑在此作个记录: (1)配置文件:当字段数太多时,需要配置字段数长度,注意其中的数字是字符串,不然

SQL编程和高级查询

一、使用SQL操作表 1、SQL语言简介 2、数据库操纵语言 (1)INSERT命令 INSERT INTO grade VALUES (5,'五年级');--插入每一列 I

分享到:

栏目导航

推荐阅读

热门阅读