STM32断言机制 assert_param(expr)

转载:https://blog.csdn.net/weixin_43583173/article/details/105614496

STM32 断言机制 assert_param(expr)

断言:用于检测一些函数的输入参数的合法性,实质就是认为定义的一个
举个例子 :
下面这段代码摘自stm32f1xx_config.h
这就是assert_param()的一种定义

#define USE_FULL_ASSERT    1
#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 */

默认情况下,断言是关闭的,也就是第一行代码注释掉了。在调试的时候可以选择打开。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)FILE, LINE))

首先这里先进行一个条件判断,如果expr这个为1,assert_param(expr)就返回(void)0;否则就返回assert_failed((uint8_t *)FILE, LINE))

FILE, __LINE__这两个是预处理宏
LINE 表示正在编译的文件的行号
FILE__表示正在编译的文件的名字

void assert_failed(uint8_t* file, uint32_t line);为函数的声明,用来返回当前的__FILE, LINE
注意啦,我们打开断言的时候 ,要在主函数添加void assert_failed(uint8_t file, uint32_t line)的定义,否则编译的时候就会报错*

void assert_failed(uint8_t* file, uint32_t line)
 {
  printf("Wrong parameters value: file %s on line %d\r\n", file, line);
  while(1);
 }

下面我们来看一段使用断言机制的代码
摘自stm32f10x_usart.c也就是串口初始化函数

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* 
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate));  
  assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength));
  assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits));
  assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity));
  assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode));
  assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct-

第一个assert_param(IS_USART_ALL_PERIPH(USARTx))
首先我们用这个初始化函数要输入两个参数,其中一个就是USARTx

#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \
                                     ((PERIPH) == USART2) || \
                                     ((PERIPH) == USART3) || \
                                     ((PERIPH) == UART4) || \
                                     ((PERIPH) == UART5))

如果USARTx为USART1,USART2…USART5中其中一个,IS_USART_ALL_PERIPH(PERIPH)返回1
否则,返回0

这样就实现了函数的参数合法性检测。

 

我当时比较好奇的是,他是如何确定expr里的参数的范围的。后来发现Drivers里的.h文件里有下面这个,

然后,也可以自己定义比如下面这个,

当时脑子没转过来.....

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值