STM32 一种参数检查用法介绍

STM32 一种参数检查用法介绍

assert_param()是一个在代码中很常见的写法,这个函数的功能一般是对函数参数的合法性进行检查,这里以一个例子进行分析:

assert_param(IS_GPIO_ALL_PERIPH(GPIOx))

函数的参数是IS_GPIO_ALL_PERIPH(GPIOx),原型为:

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||                                     ((PERIPH) == GPIOB) ||                                     ((PERIPH) == GPIOC) ||                                     ((PERIPH) == GPIOD) ||                                     ((PERIPH) == GPIOE) ||                                     ((PERIPH) == GPIOF) ||                                     ((PERIPH) == GPIOG) ||                                     ((PERIPH) == GPIOH) ||                                     ((PERIPH) == GPIOI) ||                                     ((PERIPH) == GPIOJ) ||                                     ((PERIPH) == GPIOK))

这个宏定义的作用就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A...G)基址中的一个,只要有一个为真则其值为真,否则为假。由于这个是宏定义,因此并不是在编译的时候进行判断上的简化,而是将多行代码用宏定义代替了。

下面再看看assert_param:

assert_param

函数原型如下:

#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 */

这里有一个判断,如果是FULL ASSERT,则宏定义被展开为:((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)),否则则被展开为((void)0)

先看第二种:
如果被展开为((void)0),则相当于什么也没做,那么看第一种,如果expr为真,则跟第二种的处理一样,什么也不做,如果expr为假,则执行断言失败assert_failed((uint8_t *)__FILE__, __LINE__))

既然如果选择了FULL ASSERT,那么就有断言失败的可能,因此,这里把断言失败的函数声明写上,即可避免编译错误。

再看断言失败的处理:

void assert_failed(u8* file, u32 line)

官方给出的代码如下:

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) { } 

} 

这里可以使用串口打印出来,并将程序halt在这里。STM32的这种用法,可以推广至一般的嵌入式APP开发中,在不支持高级语言的场景下,使用C语言对输入参数进行检查也是一种很好用的手段。

我们可以在应用开发时,建立一个参数检查的宏定义表,并在编写函数时使用上面的检查方式进行检查。

原文地址:https://www.cnblogs.com/RegressionWorldLine/p/12203747.html

时间: 2024-10-06 08:54:01

STM32 一种参数检查用法介绍的相关文章

mysql进阶 六 模糊查询的四种用法介绍

mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1%: 表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来. 另外,如果需要找出u_name中既有“三”又有

sudo命令用法介绍

sudo命令用法介绍 sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指 令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员.用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码. 语法:sudo(选项)(参数) 选项: -b:在后台执行指令: -h:显示帮助: -H:将HOME环境变量设为新身份的HOME环境变量: -k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

MyEclipse相关用法介绍

MyEclipse相关用法介绍 ================================================================================ 编辑: Ctrl+Shift+L      显示所有快捷键 Ctrl+K        参照选中的词(Word)快速定位到下一个 Ctrl+Shift+K      参照选中的词(Word)快速定位到上一个 Ctrl+O         快速显示OutLine Ctrl+T        快速显示当前类的

CImageList用法介绍

图像列表控制(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式.可以利用WINDOWS32位应用程序接口函数API来绘制.建立和删除图像,并能实现增加.删除.替换和拖动图像等操作.图像列表控制提供了控制图像列表的基本方法,这些方法在WINDOWS95及以后版本才能实现. (一)图像控制的对象结构 1.图像控制的数据成员 m_hImageList 连接图像对象的控制句柄 2.图像控制的建立方法 CimageL

SASS用法介绍

SASS用法介绍 SASS是一种CSS预处理器提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 安装SASS SASS需要ruby支持,还需要gem,gem是ruby的包管理工具,ruby 1.9.1是自带gem的,如果是用1.8版本的话,需要另外安装.如果是windows的话,需要安装rubygems. SASS一般会和Compass一起使用,这个也可以用gem来安装. Ruby安装完之后,运行 gem install sass --pre gem insta

sql事务(Transaction)用法介绍及回滚实例_转

sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性 当对多个表进行更新的时候,某条执行失败.为了保持数据的完整性,需要使用事务回滚. 显示设置事务 代码如下 begin try   www.2cto.com begin transaction insert into shi

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-

一直被用错的6种SQL 错误用法

一直被用错的6种SQL 错误用法 1.LIMIT 语句 2.隐式转换 3.关联更新.删除 4.EXISTS语句 5.条件下推 6.提前缩小范围 sql语句的执行顺序: FROM ON JOIN WHERE GROUP BY HAVING SELECTDISTINCT ORDER BY LIMIT 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引.