博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32库函数编程学习心得:assert_param的应用
阅读量:5061 次
发布时间:2019-06-12

本文共 1622 字,大约阅读时间需要 5 分钟。

在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。        所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个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_INGPIO_Mode_OUTGPIO_Mode_AFGPIO_Mode_AN中一个,因此宏定义IS_GPIO_MODE(MODE)能判断是其中一个为真,否则为假。因此达到调试的目的。
assert_failed()函数完成的具体操作,由用户自己定义。

(转自:http://bbs.21ic.com/icview-357261-1-1.html)

转载于:https://www.cnblogs.com/windworld17/p/4751315.html

你可能感兴趣的文章
list 容器 排序函数.xml
查看>>
存储开头结尾使用begin tran,rollback tran作用?
查看>>
Activity启动过程中获取组件宽高的五种方式
查看>>
java导出Excel表格简单的方法
查看>>
SQLite数据库简介
查看>>
利用堆实现堆排序&优先队列
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>