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这个宏既可以关闭了。

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

    关注

    32

    文章

    1093

    浏览量

    128119
  • STM32
    +关注

    关注

    2239

    文章

    10663

    浏览量

    348497
  • STM8
    +关注

    关注

    18

    文章

    391

    浏览量

    56220
收藏 人收藏

    评论

    相关推荐

    请问STM8S003引脚复用如何在程序定义呢?

    = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; /* Check the parameters */ assert_param
    发表于 04-18 06:47

    STM32F072C8T6 flash写入数据暂停异常是哪里的问题?

    = 0U; /* Process Locked */ __HAL_LOCK( pFlash); /* Check the parameters */ assert_param
    发表于 04-18 06:26

    深入理解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

    恒讯科技带大家深入理解:WebSocket服务器的工作原理

    WebSocket是一种在单个TCP连接上进行全双工通信的通信协议。它的设计目标是在Web浏览器和服务器之间提供低延迟、高效的双向通信。下面是深入理解WebSocket服务器工作原理的一些关键概念
    的头像 发表于 01-29 16:48 166次阅读

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

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

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

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

    【书籍评测活动NO.25】深入理解FFmpeg,带你FFmpeg从入门到精通

    ,涵盖音视频基础知识、FFmpeg参数解析、API使用、内部组件的开发定制 行业大咖审校,多名业界专家与学者作序推荐 详细解读实际应用与开发案例,帮助读者深入理解FFmpeg 大咖推荐 我
    发表于 11-15 14:26

    keil 5编译代码显示错误怎么解决?

    linking... ..OutputFWLIB.axf: Error: L6218E: Undefined symbol assert_param (referred from misc.o
    发表于 11-06 06:41

    深入理解redis分布式锁

    深入理解redis分布式锁 哈喽,大家好,我是指北君。 本篇文件我们来介绍如何Redis实现分布式锁的演进过程,以及为什么不能直接用Setnx实现分布式锁。 1、分布式锁简介 分布式锁是控制分布式
    的头像 发表于 10-08 14:13 561次阅读
    <b class='flag-5'>深入理解</b>redis分布式锁

    311集(56.4#100)观察 GPIO 初始化 assert_param 函数做了什么?

    嵌入式程序函数
    于振南的单片机世界
    发布于 :2023年08月27日 15:11:47

    深入理解微电子电路设计——数字电子技术及应用》+深究数字芯片的内核与要点

    吧,与感兴趣的同仁一起来领略一下《深入理解微电子电路设计》吧! 《深入理解微电子电路设计》是2020年清华大学出版社出版的图书,由宋延强翻译。原书作者是[美] 理查德 · C.耶格(Richard
    发表于 07-29 11:59

    C语言中assert的使用

    assert意思是断言,常用在程序的DEBUG版本中。
    发表于 07-21 14:51 501次阅读

    深入理解微电子电路设计——数字电子技术及其应用》+做芯片的不做芯片的都来看一看!

    也陆陆续续看了一些资料,但是在多方权衡之后还是放弃了这种幼稚的想法,还是老老实实做好自己的应用开发,虽然薪资和芯片设计本身相差不少。扯远了,回到书本本身,一起来领略一下《深入理解微电子
    发表于 05-29 22:24