• 售前

  • 售后

热门帖子
入门百科

嵌入式C语言基础之断言

[复制链接]
123457376 显示全部楼层 发表于 2022-1-12 12:07:11 |阅读模式 打印 上一主题 下一主题
断言一般会用做函数入口参数的有效性判断,在STM32的HAL库中就有很多应用,比如在STM32F429中断优先级分组配置函数中(此处只说断言应用,不对STM32F429的中断分组做过多讨论):
  1. void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
  5.   
  6.   /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
  7.   NVIC_SetPriorityGrouping(PriorityGroup);
  8. }
复制代码
这里第一条语句assert_param就是断言函数,它用来判断函数参数PriorityGroup是否合法,断言函数assert_param使用一个宏来实现的,通过MDK的“Go To Definition of ‘assert_param’”可以在stm32f4xx_hal_conf.h中找到其定义如下:
  1. #ifdef  USE_FULL_ASSERT
  2. /**
  3.   * @brief  The assert_param macro is used for function's parameters check.
  4.   * @param  expr: If expr is false, it calls assert_failed function
  5.   *         which reports the name of the source file and the source
  6.   *         line number of the call that failed.
  7.   *         If expr is true, it returns no value.
  8.   * @retval None
  9.   */
  10.   #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
  11. /* Exported functions ------------------------------------------------------- */
  12.   void assert_failed(uint8_t* file, uint32_t line);
  13. #else
  14.   #define assert_param(expr) ((void)0)
  15. #endif /* USE_FULL_ASSERT */  
复制代码
宏USE_FULL_ASSERT是用来表示是否支持断言的开关,如果没有定义这个宏,那么断言函数assert_param无任何操作;如果开启了断言,那么它将通过三目操作符来进行判断,如果expr为真,不执行任何操作,如果expr为假,执行assert_failed函数。assert_failed函数在库中只有声明,没有定义,需要用户自己根据实际开发需要去实现其功能,该函数的两个参数分别是调用assert_failed函数(即参数不合法)的文件的文件名和行号,可以通过该函数打印参数不合法的文件及不合法的行号位置。
回到最初的HAL_NVIC_SetPriorityGrouping函数,这里assert_param函数的参数IS_NVIC_PRIORITY_GROUP也是一个宏,定义在stm32f4xx_hal_cortex.h中:
  1. #define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \
  2.                                        ((GROUP) == NVIC_PRIORITYGROUP_1) || \
  3.                                        ((GROUP) == NVIC_PRIORITYGROUP_2) || \
  4.                                        ((GROUP) == NVIC_PRIORITYGROUP_3) || \
  5.                                        ((GROUP) == NVIC_PRIORITYGROUP_4))
复制代码
stm32f429的中断分组共0-4五组,如果函数参数PriorityGroup不是这五个之一,那么整个表达式为假,此时调用断言函数中的assert_failed函数来打印错误信息。

来源:https://blog.caogenba.net/qq_43471489/article/details/122420817
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作