1 老司机带你深入理解ST库中的 assert_param 语句-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

老司机带你深入理解ST库中的 assert_param 语句

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-14 14:52 次阅读

还有没上车的吗

马上要开车了

不等了,开始发车

老司机,再稍我一个

车已经发动了

你等下一班车吧

车子运行中,大伙儿坐稳啦!

库函数中的assert_param

STM8STM32标准外设库,或者HAL库的stm8_conf.h、stm32···_conf.h文件中会看见如下一段代码:

/* #define USE_FULL_ASSERT 1 */

#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

voidassert_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__))

相当于是一个条件语句。

此时,还需要我们实现assert_failed函数,如果不实现,则会报错(后面来讲具体如何实现)。

而在其他地方调用情况(如GPIO)

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

assert_param(IS_GPIO_PIN(GPIO_Pin));

GPIOx->BSRR = GPIO_Pin;

}

调用assert_param的主要作用就是检测参数正确与否,即我们所说的断言。

assert_param详情

1.STM8S中的assert_param

细心的朋友会发现,STM8标准外设库stm8s_conf.h中开启了USE_FULL_ASSERT这个宏:

#define USE_FULL_ASSERT (1)

开启USE_FULL_ASSERT这个宏,就意味着要实现assert_failed((uint8_t *)__FILE__, __LINE__))这个函数;

那么我就在main.c文件下,按照官方的例程实现了assert_failed函数:

#ifdef USE_FULL_ASSERT //断言(参考官方)

void assert_failed(u8* file, u32 line)

{

while (1)

{

}

}

#endif

2.STM32中的assert_param

在STM32标准外设库,HAL库中的USE_FULL_ASSERT这个宏是被屏蔽了的。故程序运行#define assert_param(expr) ((void)0)

也就是没有做任何处理。

我之前提供的例程中,为了不动官方代码,assert_param这个函数都是没有使用的。

3.assert_failed((uint8_t *)__FILE__, __LINE__))

看到这个函数,就要说下__FILE__和__LINE__这两个标准定义。

__LINE__:正在编译文件的行号

__FILE__:正在编译文件的文件名

还不懂的同学,建议参考之前的文章【ANSIC几种特殊的标准定义(__FILE__、__LINE__、__STDC__···)】。

而上面只是申明,函数具体的实现还需要自己实现。理解了上面两个参数,相信大家都会知道如何实现了。需要根据自己项目情况来实现。常规举例:

voidassert_failed(uint8_t* file, uint32_t line)

{

printf("Error code in file:%s,line:%u ",file,line);

}

这条语句在调及产品出厂之前测试是很有必要的,方便分析问题所在。正式推出版本,不定义USE_FULL_ASSERT这个宏既可以关闭了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ST
    ST
    +关注

    关注

    32

    文章

    1133

    浏览量

    128909
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355712
  • STM8
    +关注

    关注

    18

    文章

    392

    浏览量

    56774
收藏 人收藏

    评论

    相关推荐

    深入探讨Linux系统的动态链接机制

    异常或崩溃。为深入理解动态链接机制及其工作原理,我重温了《程序员的自我修养》,并通过实践演示与反汇编分析,了解了动态链接的过程。 本文将深入探讨Linux系统的动态链接机制,这其中
    的头像 发表于 12-18 10:06 66次阅读
    <b class='flag-5'>深入</b>探讨Linux系统<b class='flag-5'>中</b>的动态链接<b class='flag-5'>库</b>机制

    深入理解C语言:循环语句的应用与优化技巧

    能让你的代码更加简洁明了,还能显著提升程序执行效率。本文将详细介绍C语言中的三种常见循环结构——while循环、for循环和do...while循环,带你深入理解
    的头像 发表于 12-07 01:11 100次阅读
    <b class='flag-5'>深入理解</b>C语言:循环<b class='flag-5'>语句</b>的应用与优化技巧

    技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程,条件判断语句是控制程序流程的核心元素之一。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在C语言中,条件判断语句的使用极为广泛,涵盖了从简单的if语句到更复杂的
    的头像 发表于 11-09 01:10 287次阅读
    技术干货驿站 ▏<b class='flag-5'>深入理解</b>C语言:掌握C语言条件判断,从if到switch的应用

    深入理解FPD-link III ADAS解串器HUB产品

    德赢Vwin官网 网站提供《深入理解FPD-link III ADAS解串器HUB产品.pdf》资料免费下载
    发表于 09-06 09:58 1次下载
    <b class='flag-5'>深入理解</b>FPD-link III ADAS解串器HUB产品

    技术干货驿站 ▏深入理解C语言:基本数据类型和变量

    在C语言中,数据类型和变量是编程的基础,也是理解更复杂概念的关键。数据类型决定了变量的内存分配、存储范围和操作方式,而变量则是存储数据的容器。本篇文章将从基本数据类型和变量两个方面,带你深入了解C
    的头像 发表于 07-26 17:53 2088次阅读
    技术干货驿站 ▏<b class='flag-5'>深入理解</b>C语言:基本数据类型和变量

    KW-2402铂RTD传感器的SPICE模型的其中一句LTspice仿真语句是什么意思呢?

    我想问下,.param UNIT=(IF(T1&gt;0,1,0))这句仿真语句,怎么理解呢? 最近在做测温电路,正好读到了ADI智新出来的一个资料(非常非常好)。看到这个仿
    发表于 06-04 13:30

    stm8l用iar download debug时出错的原因?

    错误提示是:Error[Li005]: no definition for \"assert_param\" [referenced from D
    发表于 05-13 06:41

    STM32F103C8T6时钟RTC每次启动变慢1s是为什么?

    ; /* Check input parameters */ if(hrtc == NULL) { return HAL_ERROR; } /* Check the parameters */ assert_param
    发表于 05-13 06:25

    请问HAL函数对Handle有效性的检查为什么不是用assert_param断言?

    */ if (hspi == NULL) { return HAL_ERROR; } /* Check the parameters */ assert_param(IS_SPI_ALL_INSTANCE
    发表于 05-08 07:00

    stm32F407 USART发送数据,TC不能置位是怎么回事?

    ; /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_FLAG
    发表于 04-25 06:15

    深入理解FFmpeg阅读体验》

    ,运动图像专家组)联合制定的视频编码标准。而X264是一个开源的H.264/MPEG-4 AVC视频编码函数,是最好的有损视频编码器之一。 先直接从网络(http
    发表于 04-16 22:54

    如何在if和assert做选择

    面的定义可以看到: 如果定义了宏 NDEBUG,那么 assert() 宏将不做什么动作,也就是相当于一条空语句:(void)0;,当在 release 阶段编译代码的时候,都会在编译选项
    发表于 04-08 06:13

    深入理解 FPGA 的基础结构

    转载地址:https://zhuanlan.zhihu.com/p/506828648 文章很详细的介绍了FPGA的基础结构,能更直观的理解内部结构原理。对深入学习很有帮助。 以下是正文: 这一段
    发表于 04-03 17:39

    深入理解光耦模拟隔离放大电路的技术奥秘

    深入理解光耦模拟隔离放大电路的技术奥秘 ​编辑 ▲ 图1 仿真原理图二、原理分析 之所以这个电路图看起来容易让人感到困惑,实际上就是这个仿真电路,错误的使用了这样的光电三极管来表示HCNR201
    发表于 01-10 10:12

    深入理解FFmpeg阅读体验》+ 书收到了,崭新的开篇

    今天收到了《深入理解FFmpeg》 崭新的书,一个在2022年较近距离接触过却尚未深入研究的领域图像处理。最近刚好在作这方面的研究,希望自己可以把握这次机会,好好学习下 FFMpeg,相信可以让自己
    发表于 01-07 18:57